参考 : 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)相关推荐

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

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

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

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

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

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

  4. 设计模式 -结构型模式_ 装饰者模式Decorator Pattern 在开源软件中的应用

    文章目录 定义 结构图 需求 装饰者模式 装饰者模式在MyBatis中的应用 小结 定义 装饰模式 Decorator : 在不改变原有功能的基础上, 动态的给一个对象添加一些额外的职责 ,非常符合开 ...

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

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

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

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

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

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

  8. 装饰者模式(Decorator pattern)

    说起来惭愧,在某群解答别人问题时居然回答错误,羞煞我也.为此特地补习一下. :( 装饰者模式 作用: 动态给对象添加职责 典型案例: 在一般的留言本中(支持UBB)输入文本,按B设置为粗体,I为斜体, ...

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

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

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

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

最新文章

  1. [转载]日历设计之重复事件规则设计
  2. UVa LA 4253 UVa 1421 Archery 枚举,状态削减,oj错误题目 难度: 1
  3. ApkTool反编译出错brut.common.brutexception及java.io.filenotfoundexception 之一
  4. 使用localStorage写一个简单的备忘录
  5. Fiddler + 夜神模拟器 APP接口调试
  6. asp.net 得到上一页地址
  7. html语言闪烁特效代码,css3 文字闪烁特效代码
  8. pythonturtle画彩虹蟒蛇_python如何用turtle库画蟒蛇?
  9. Principle for Mac:让你五分钟即可制作出一个具有完整交互动画的原型
  10. 2020最新文本检测算法TextFuseNet
  11. Windows Phone 程序发布过程
  12. 【软件需求工程】北理的恶龙们——软件需求规格说明
  13. 群晖京东云对象存储_干货 | 基于Go SDK操作京东云对象存储OSS的入门指南
  14. SpringCloud2.0 集成分布式事务管理 LCN
  15. SPI FLASH 波形测量演示实例
  16. DSPE-PEG8-Mal包含DSPE和马来酰亚胺基团
  17. 【neo4j】去除重复节点
  18. Android 百度地图导航引擎初始化失败
  19. Unity基础篇:Serializable总结与深入研究。
  20. 思科瑞科创板上市破发:年营收2.22亿 公司市值54亿

热门文章

  1. laravel composer报错You can run './vendor/bin/upgrade-carbon' to get help in updating carbon and other
  2. (1)、win10 本地 安装 rabbitmq
  3. Linux用php上传表单文件,文件太大提示[413 Request Entity Too Large]
  4. PCA相关 PCL库和Matlab对比
  5. 总有被遗忘或者没有及时跟进的工作
  6. 新版FireFox使用NPAPI插件的办法
  7. 人工智能或可称之为人造智能
  8. CMKY与RGB的转换
  9. C中无警告输出size_t的值
  10. 热感传导不能证明经络的存在