23种设计模式完整教程

介绍

装饰者模式(Decorator Pattern)是指在不改变原有对象的基础之上,将功能附加到对 象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。

装饰者模式在我们生活中应用也比较多如给煎饼加鸡蛋;给蛋糕加上一些水果;给房子 装修等,为对象扩展一些额外的职责。

优点

1、装饰者是继承的有力补充,比继承灵活,不改变原有对象的情况下动态地给一个对象 扩展功能,即插即用。

2、通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果。

3、装饰者完全遵守开闭原则。

缺点

1、会出现更多的代码,更多的类,增加程序复杂性。

2、动态装饰时,多层装饰时会更复杂。

使用场景

1、用于扩展一个类的功能或给一个类添加附加职责。

2、动态的给一个对象添加功能,这些功能可以再动态的撤销。

3、装饰器模式在源码中也应用得非常多,在 JDK 中体现最明显的类就是 IO 相关的类,如 BufferedReader、InputStream、OutputStream。

使用建议

具体实现

类图

代码

package com.knowledge.system.software_design_pattern.decorator.course_instance;public abstract class Battercake {public   abstract String getMsg();public   abstract int getPrice();
}
package com.knowledge.system.software_design_pattern.decorator.course_instance;public class BaseBattercake extends Battercake {@Overridepublic String getMsg() {return "煎饼";}@Overridepublic int getPrice() {return 5;}
}
package com.knowledge.system.software_design_pattern.decorator.course_instance;public  abstract class BattercakeDecorator extends BaseBattercake{//静态代理,委派private Battercake battercake;public BattercakeDecorator(Battercake battercake) {this.battercake = battercake;}protected abstract void doSomething();@Overridepublic String getMsg() {return battercake.getMsg();}@Overridepublic int getPrice() {return battercake.getPrice();}
}
package com.knowledge.system.software_design_pattern.decorator.course_instance;public class EggDecorator extends BattercakeDecorator{public EggDecorator(Battercake battercake) {super(battercake);}@Overrideprotected void doSomething() {System.out.println("加鸡蛋");}@Overridepublic String getMsg() {return super.getMsg()+"+ 1个 鸡蛋";}@Overridepublic int getPrice() {return super.getPrice()+1;}
}
package com.knowledge.system.software_design_pattern.decorator.course_instance;public class SauageDecorator extends BattercakeDecorator{public SauageDecorator(Battercake battercake) {super(battercake);}@Overrideprotected void doSomething() {System.out.println("香肠");}@Overridepublic String getMsg() {return super.getMsg()+"+1根 香肠";}@Overridepublic int getPrice() {return super.getPrice()+2;}}
package com.knowledge.system.software_design_pattern.decorator.course_instance;/**** 1.OOM关系* 2.前置考虑* 3.源码实例:JDK中的输入输出流、MyBatis的org.apache.ibatis.cache.Cache、Spring 中的TransactionAwareCacheDecorator 类* 4.动态的给一个对象添加功能,这些功能可以再动态的撤销* 5.用于扩展一个类的功能或给一个类添加附加职责*/
public class Test {public static void main(String[] args) {System.out.println("装饰者模式");Battercake battercake;battercake=new BaseBattercake();battercake=new EggDecorator(battercake);battercake=new SauageDecorator(battercake);battercake=new SauageDecorator(battercake);System.out.println(battercake.getMsg()+",总价:"+battercake.getPrice());}}

装饰器模式(Decorator Pattern)相关推荐

  1. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  2. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  3. 【Java设计模式系列】装饰器模式(Decorator Pattern)

    简介 一般有两种方式可以给一个类或对象新增行为: 继承 子类在拥有自身方法同时还拥有父类方法.但这种是静态的,用户无法控制增加行为的方式和时机. 关联 将一个类的对象嵌入另一个对象,由另一个对象决定是 ...

  4. 极速理解设计模式系列:23.装饰器模式(Decorator Pattern)

    五个角色:部件(Component).具体部件(ConcreteComponent).装饰抽象类(Decorator).具体装饰对象(ConcreteDecorator).客户端(Client) 部件 ...

  5. decorator java_装饰器模式-Decorator(Java实现)

    装饰器模式-Decorator(Java实现) 装饰器模式允许向一个现有的对象添加新的功能, 同时又不改变其结构. 其中 "现有对象"在本文中是StringDisplay类. 添加 ...

  6. c语言装饰,C/C++知识点之装饰器模式(Decorator) C++

    本文主要向大家介绍了 C/C++知识点之装饰器模式(Decorator) C++,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助.装饰器模式是比较常用的一种设计模式,Python中就 ...

  7. 装饰器模式--Decorator

    装饰器模式 定义: 装饰者模式(Decorator Pattern)是指在不改变原有对象的基础之上,将一些新的功能动态的添加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模 ...

  8. 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)

    在前两篇博客中详细的介绍了"策略模式"和"观察者模式",今天我们就通过花瓶与鲜花的例子来类比一下"装饰模式"(Decorator Patte ...

  9. 装饰器模式(Decorator)

    一.装饰者模式的定义: 装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 结构: 装饰器UML.png (1)抽象构件( ...

  10. C++实现装饰者模式Decorator Pattern

    设计原则5:类应该对扩展开放,对修改关闭. 目标:允许类容易扩展,在不修改现有代码的情况下,就可搭配新的行为. 好处:设计具有弹性可以应对改变,可以接受新的功能来应对改变的需求. 遇到的问题:类数量爆 ...

最新文章

  1. Java设计模式---外观模式
  2. swing开发图形界面工具配置(可自由拖控件上去)
  3. php new对象 调用函数,关于JS中new调用函数的原理介绍
  4. sas infile和filename
  5. 这些Java基础面试知识点,你都掌握了吗?
  6. Oracle 10g学习笔记(一)
  7. 车辆动力学及控制_传统汽车的稳定性控制系统主要通过各个车轮制动进行短暂动作...
  8. 688561,安全新代码!
  9. Spring MVC中静态资源加载
  10. HDU6268 Master of Subgraph
  11. 利用新浪api获取ip归属地
  12. 阿铭Linux_网站维护学习笔记20190408
  13. 台式计算机常用的网卡类型,台式机无线网卡如何查看型号
  14. 命令提示符怎么以管理员方式打开
  15. 一梦三四年——国产MOBA网游的巅峰
  16. 网站seo优化方式途径
  17. 【反射机制】与 【xml解析 】之 巧夺天工 —————— 开开开山怪
  18. 【转】网页基础:网页设计(我所知道的所有的html和css代码(含H5和CSS3)),如有错误请批评指正...
  19. sqlserver update join 多关联更新
  20. 初学者学习编程大概需要多久精通

热门文章

  1. 使textarea支持tab缩进
  2. EC600S-CN CAT1通信模组,2G退网升级4G如何选择,QuecPython开发资源下载
  3. leetcode957. Prison Cells After N Days
  4. 【多线程】线程的生命周期
  5. 【Angular 4】组件生命周期钩子
  6. spring boot 使用devtools热部署
  7. 15.5.1【Task实现细节】 生成的代码
  8. 教你如何在Mac上搭建自己的服务器——Nginx
  9. Git学习之路(6)- 分支操作
  10. dubbo 学习笔记 -- provider端