java设计模式之decoration模式

举报
程序员历小冰 发表于 2021/08/27 22:41:41 2021/08/27
【摘要】 本人近来正在学习研读《head first 设计模式》,有读了知名的博文《最牛B的程序员训练方法》,故想写篇博文,总结一下自己学习设计模式的体会和感悟,不好之处,请多多包涵,如诺指出其中的错误,本人不胜感激。   设计模式的本源是java开发中面向对象的各种原则,例如依赖倒置原则(DIP),开闭原则(OCP),依赖接口编程(...

本人近来正在学习研读《head first 设计模式》,有读了知名的博文《最牛B的程序员训练方法》,故想写篇博文,总结一下自己学习设计模式的体会和感悟,不好之处,请多多包涵,如诺指出其中的错误,本人不胜感激。

  设计模式的本源是java开发中面向对象的各种原则,例如依赖倒置原则(DIP),开闭原则(OCP),依赖接口编程(programming to interface)等。但其根本的目的是信息隐藏,和模块化。然后最终的追求便是程序的效用、坚固、和审美。这是设计模式的滥觞所在。

        使用设计模式有什么好处呢?当你在和其他程序员交流时,你使用设计模式的共享语句,其实“不只是”和他人共享“行话”而已。理由如下:

         一:共享模式的词汇“威力强大”。当你使用模式名称和其他开发人员或者开发团队交流时,你们之间交流的不只是模式名称,而是整套模式背后所象征的质量、特性、和约束。

        二:模式能让你使用更少的词做更充分的交流。这对于“少言”的程序员可是一大幸事啊。

        三:设计模式可以让你更专注于“设计圈子”。这样便不会过早的设计底层细节实现的思考。(三条内容摘自《head first 设计模式》)

       《head first 设计模式》中以星巴克咖啡店的自动售货系统为例进行情景设计:顾客购买咖啡时,可以按照其要求在咖啡中加入不同的各种调料,例如:摩卡,豆浆或者覆盖奶泡。系统会根据所加入的调料收取不同的费用。所以不同的咖啡和调料间的自由组合便造成了大量的对象,这会给维护带来极大的麻烦。

       由此出发,我们使用装饰者模式,即动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。其中的细节是:

      一:装饰者和被装饰对象有相同的超类型。

      二:可以使用一个或多个装饰者包装一个对象。

      三:任何需要原始对象(被包装)的场合,可以使用装饰者对象替代它。

      四:装饰者可以在所委托的被装饰者的行为之前或之后,加上自己的行为,已到达特定目的。

      五:装饰者可以包装装饰者,这时的被包装的装饰者一定已经包装了一个被装饰者。

     总体而言,装饰者是避免在类似情节时使用简单继承时产生的大量类对象的维护噩梦而形成的。

     下面是一个例子:

      这是装饰者的超类:


  
  1. public abstract class 装饰者抽象类 extends 咖啡抽象类{
  2. public abstract String 咖啡名称();
  3. }


  
  1. public abstract class 咖啡抽象类 {
  2. String cfName = "not Name";
  3. public String 咖啡名称(){
  4. return cfName;
  5. }
  6. public abstract double 价格();
  7. }


  
  1. public class 装饰A extends 装饰者抽象类{
  2. 咖啡抽象类 cf;
  3. public 装饰A(咖啡抽象类 cf){
  4. this.cf = cf;
  5. }
  6. @Override
  7. public String 咖啡名称() {
  8. return cf.咖啡名称() + " 装饰A";
  9. }
  10. @Override
  11. public double 价格() {
  12. return cf.价格() + 123.01;
  13. }
  14. }


  
  1. public class 装饰B extends 装饰者抽象类{
  2. 咖啡抽象类 cf;
  3. public 装饰B(咖啡抽象类 cf){
  4. this.cf = cf;
  5. }
  6. @Override
  7. public String 咖啡名称() {
  8. return cf.咖啡名称() + " 装饰B";
  9. }
  10. @Override
  11. public double 价格() {
  12. return cf.价格() + 165.01;
  13. }
  14. }




  
  1. public class 咖啡种类A extends 咖啡抽象类{
  2. public 咖啡种类A(){
  3. cfName = "咖啡种类A";
  4. }
  5. @Override
  6. public double 价格() {
  7. return 10.11;
  8. }
  9. }


 


  
  1. public class 测试 {
  2. public static void main(String[] args) {
  3. 咖啡抽象类 c = new 装饰A(new 咖啡种类A());
  4. System.out.println(c.咖啡名称());
  5. System.out.println(c.价格());
  6. }
  7. }


     

     

                          

       

文章来源: blog.csdn.net,作者:程序员历小冰,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/u012422440/article/details/17142311

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。