装饰器模式(Decorator Pattern)
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)相关推荐
- python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- 【Java设计模式系列】装饰器模式(Decorator Pattern)
简介 一般有两种方式可以给一个类或对象新增行为: 继承 子类在拥有自身方法同时还拥有父类方法.但这种是静态的,用户无法控制增加行为的方式和时机. 关联 将一个类的对象嵌入另一个对象,由另一个对象决定是 ...
- 极速理解设计模式系列:23.装饰器模式(Decorator Pattern)
五个角色:部件(Component).具体部件(ConcreteComponent).装饰抽象类(Decorator).具体装饰对象(ConcreteDecorator).客户端(Client) 部件 ...
- decorator java_装饰器模式-Decorator(Java实现)
装饰器模式-Decorator(Java实现) 装饰器模式允许向一个现有的对象添加新的功能, 同时又不改变其结构. 其中 "现有对象"在本文中是StringDisplay类. 添加 ...
- c语言装饰,C/C++知识点之装饰器模式(Decorator) C++
本文主要向大家介绍了 C/C++知识点之装饰器模式(Decorator) C++,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助.装饰器模式是比较常用的一种设计模式,Python中就 ...
- 装饰器模式--Decorator
装饰器模式 定义: 装饰者模式(Decorator Pattern)是指在不改变原有对象的基础之上,将一些新的功能动态的添加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模 ...
- 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)
在前两篇博客中详细的介绍了"策略模式"和"观察者模式",今天我们就通过花瓶与鲜花的例子来类比一下"装饰模式"(Decorator Patte ...
- 装饰器模式(Decorator)
一.装饰者模式的定义: 装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 结构: 装饰器UML.png (1)抽象构件( ...
- C++实现装饰者模式Decorator Pattern
设计原则5:类应该对扩展开放,对修改关闭. 目标:允许类容易扩展,在不修改现有代码的情况下,就可搭配新的行为. 好处:设计具有弹性可以应对改变,可以接受新的功能来应对改变的需求. 遇到的问题:类数量爆 ...
最新文章
- Java设计模式---外观模式
- swing开发图形界面工具配置(可自由拖控件上去)
- php new对象 调用函数,关于JS中new调用函数的原理介绍
- sas infile和filename
- 这些Java基础面试知识点,你都掌握了吗?
- Oracle 10g学习笔记(一)
- 车辆动力学及控制_传统汽车的稳定性控制系统主要通过各个车轮制动进行短暂动作...
- 688561,安全新代码!
- Spring MVC中静态资源加载
- HDU6268 Master of Subgraph
- 利用新浪api获取ip归属地
- 阿铭Linux_网站维护学习笔记20190408
- 台式计算机常用的网卡类型,台式机无线网卡如何查看型号
- 命令提示符怎么以管理员方式打开
- 一梦三四年——国产MOBA网游的巅峰
- 网站seo优化方式途径
- 【反射机制】与 【xml解析 】之 巧夺天工 —————— 开开开山怪
- 【转】网页基础:网页设计(我所知道的所有的html和css代码(含H5和CSS3)),如有错误请批评指正...
- sqlserver update join 多关联更新
- 初学者学习编程大概需要多久精通