装饰者模式 (decorator pattern)
参考 : Head First 设计模式(中文版)
这篇只作为个人温习!
用意 : 动态地给一个对象添加|扩展一些行为。Decorator 强调用对象组合而非继承来实现扩展,这显得较为灵活。
角色:
1.装饰者
2.被装饰者
特点与原理 :
0."被装饰者"被装饰之后,会被"装饰者"给包起来,外界看来它是被替代掉了,或者说原本的"被装饰者"被隔离了。
1."装饰者 "和"被装饰者 "必须是同一个抽象类派生出来的。(因为"装饰者"必须能替代掉"被装饰者")
2."装饰者"也可以被装饰(可以一直被再装饰),但是"被装饰者"不能装饰别人.
3."被装饰者"可以说是一个起点,一但它被"装饰者"装饰后,装饰者将替代掉它.
4.比如 a 对象被 b对象装饰后 , 外界就不能在访问a对象,b对象会保留a对象指针,那么外界通过调用 b 对象的方法来实现功能 , 这样我们便可以定义扩展方法在b对象上,b既可以调用原始a对象的方法,也可以添加扩展方法。
简单例子 :
public abstract class Product //基类 { public abstract double getPrice(); //既然是要扩展,自然是用抽象方法咯 } public class Nasi : Product //"被装饰者"一定要派生自基类 {public override double getPrice(){return 100.00;} } public abstract class Decorator : Product //"装饰者"一定要派生自基类 {public Product product { get; set; } //每个装饰者都必须保留被装饰对象的指针 } public class Sayur : Decorator { public Sayur(Product product) //这里的product既可以是"装饰者"也可以是"被装饰者" {this.product = product; //保存指针 }public override double getPrice(){return this.product.getPrice() + 10; //调用原来方法,再添加扩展逻辑 } } protected void Page_Load(object sender, EventArgs e) {Product nasi = new Nasi();Product nasiWithSayur = new Sayur(nasi); //用Sayur这个"装饰者"来装饰product,装饰后product就被替换掉了.Product nasiWithDoubleSayur = new Sayur(nasiWithSayur); //第2次装修返回的又是另一个对象了double price = nasiWithDoubleSayur.getPrice();//由于我们是面向抽象编程,所以不管怎么装饰都好,这个对象依旧是一个Product,所以就一定有getPrice方法,只是它的内部已经是不同的实现了。 }
记忆联想 :
规范 : 装饰对象,和被装饰的对象都派生自一个类
实现 : 对象包对象,外层对象的方法是调用内层对象并且加上自己的逻辑扩展。
转载于:https://www.cnblogs.com/keatkeat/p/4000420.html
装饰者模式 (decorator pattern)相关推荐
- C++实现装饰者模式Decorator Pattern
设计原则5:类应该对扩展开放,对修改关闭. 目标:允许类容易扩展,在不修改现有代码的情况下,就可搭配新的行为. 好处:设计具有弹性可以应对改变,可以接受新的功能来应对改变的需求. 遇到的问题:类数量爆 ...
- 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)
在前两篇博客中详细的介绍了"策略模式"和"观察者模式",今天我们就通过花瓶与鲜花的例子来类比一下"装饰模式"(Decorator Patte ...
- 极速理解设计模式系列:23.装饰器模式(Decorator Pattern)
五个角色:部件(Component).具体部件(ConcreteComponent).装饰抽象类(Decorator).具体装饰对象(ConcreteDecorator).客户端(Client) 部件 ...
- 设计模式 -结构型模式_ 装饰者模式Decorator Pattern 在开源软件中的应用
文章目录 定义 结构图 需求 装饰者模式 装饰者模式在MyBatis中的应用 小结 定义 装饰模式 Decorator : 在不改变原有功能的基础上, 动态的给一个对象添加一些额外的职责 ,非常符合开 ...
- python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- 【Java设计模式系列】装饰器模式(Decorator Pattern)
简介 一般有两种方式可以给一个类或对象新增行为: 继承 子类在拥有自身方法同时还拥有父类方法.但这种是静态的,用户无法控制增加行为的方式和时机. 关联 将一个类的对象嵌入另一个对象,由另一个对象决定是 ...
- 装饰者模式(Decorator pattern)
说起来惭愧,在某群解答别人问题时居然回答错误,羞煞我也.为此特地补习一下. :( 装饰者模式 作用: 动态给对象添加职责 典型案例: 在一般的留言本中(支持UBB)输入文本,按B设置为粗体,I为斜体, ...
- decorator java_装饰器模式-Decorator(Java实现)
装饰器模式-Decorator(Java实现) 装饰器模式允许向一个现有的对象添加新的功能, 同时又不改变其结构. 其中 "现有对象"在本文中是StringDisplay类. 添加 ...
- c语言装饰,C/C++知识点之装饰器模式(Decorator) C++
本文主要向大家介绍了 C/C++知识点之装饰器模式(Decorator) C++,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助.装饰器模式是比较常用的一种设计模式,Python中就 ...
最新文章
- [转载]日历设计之重复事件规则设计
- UVa LA 4253 UVa 1421 Archery 枚举,状态削减,oj错误题目 难度: 1
- ApkTool反编译出错brut.common.brutexception及java.io.filenotfoundexception 之一
- 使用localStorage写一个简单的备忘录
- Fiddler + 夜神模拟器 APP接口调试
- asp.net 得到上一页地址
- html语言闪烁特效代码,css3 文字闪烁特效代码
- pythonturtle画彩虹蟒蛇_python如何用turtle库画蟒蛇?
- Principle for Mac:让你五分钟即可制作出一个具有完整交互动画的原型
- 2020最新文本检测算法TextFuseNet
- Windows Phone 程序发布过程
- 【软件需求工程】北理的恶龙们——软件需求规格说明
- 群晖京东云对象存储_干货 | 基于Go SDK操作京东云对象存储OSS的入门指南
- SpringCloud2.0 集成分布式事务管理 LCN
- SPI FLASH 波形测量演示实例
- DSPE-PEG8-Mal包含DSPE和马来酰亚胺基团
- 【neo4j】去除重复节点
- Android 百度地图导航引擎初始化失败
- Unity基础篇:Serializable总结与深入研究。
- 思科瑞科创板上市破发:年营收2.22亿 公司市值54亿
热门文章
- laravel composer报错You can run './vendor/bin/upgrade-carbon' to get help in updating carbon and other
- (1)、win10 本地 安装 rabbitmq
- Linux用php上传表单文件,文件太大提示[413 Request Entity Too Large]
- PCA相关 PCL库和Matlab对比
- 总有被遗忘或者没有及时跟进的工作
- 新版FireFox使用NPAPI插件的办法
- 人工智能或可称之为人造智能
- CMKY与RGB的转换
- C中无警告输出size_t的值
- 热感传导不能证明经络的存在