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

部件(Component):定义对象的接口,可以给对象动态增加职责。

具体部件(ConcreteComponent):实现对象。

装饰抽象类(Decorator):维护一个部件的实例,并且提供一个和部件相同的接口以使用。

具体装饰对象(ConcreteDecorator):实现装饰效果,增加职责。

客户端(Client):使用装饰包围部件,让部件增加功能。

实现思路:根据部件的需要动态的为部件增加职责功能。

类图:

应用场景:做四川菜,做广东菜。

分析:在本实例中设置做四川菜还需要一个汤,一盘水果,做广东菜的时候需要一个汤还需要蘸酱,不需要水果。

下面我们在控制台程序去演示一下如何使用Decorator Pattern:

一、部件(Component)

  1. //部件(Component)
  2. public abstract class Cooking
  3. {
  4. public abstract void Cook();
  5. }

二、具体部件(ConcreteComponent)

  1. //具体部件(ConcreteComponent)
  2. public class SichuanFood : Cooking
  3. {
  4. public override void Cook()
  5. {
  6. Console.WriteLine("炒川菜");
  7. }
  8. }
  9. //具体部件(ConcreteComponent)
  10. public class GuangdongFood : Cooking
  11. {
  12. public override void Cook()
  13. {
  14. Console.WriteLine("炒广东菜");
  15. }
  16. }

三、装饰抽象类(Decorator)

  1. //装饰抽象类(Decorator)
  2. abstract class Decorator : Cooking
  3. {
  4. protected Cooking cooking;
  5. public Decorator(Cooking cook)
  6. {
  7. this.cooking = cook;
  8. }
  9. public override void Cook()
  10. {
  11. cooking.Cook();
  12. }
  13. }

四、具体装饰对象(ConcreteDecorator)

  1. //具体装饰对象(ConcreteDecorator)
  2. class Soup : Decorator
  3. {
  4. public Soup(Cooking cook):base(cook)
  5. {
  6. }
  7. public override void Cook()
  8. {
  9. base.Cook();
  10. Console.WriteLine("加做一个汤");
  11. }
  12. }
  13. //具体装饰对象(ConcreteDecorator)
  14. class Fruit : Decorator
  15. {
  16. public Fruit(Cooking cook)
  17. : base(cook)
  18. {
  19. }
  20. public override void Cook()
  21. {
  22. base.Cook();
  23. Console.WriteLine("再加一盘水果");
  24. }
  25. }
  26. //具体装饰对象(ConcreteDecorator)
  27. class Sauce : Decorator
  28. {
  29. public Sauce(Cooking cook)
  30. : base(cook)
  31. {
  32. }
  33. public override void Cook()
  34. {
  35. base.Cook();
  36. Console.WriteLine("再加一碟酱汁");
  37. }
  38. }

五、客户端(Client)

  1. //客户端(Client)
  2. class Program
  3. {
  4. static void Main(string[] args)
  5. {
  6. Cooking sichuan = new SichuanFood();
  7. Decorator corator = new Soup(sichuan);
  8. Decorator fruit = new Fruit(corator);
  9. fruit.Cook();
  10. Console.WriteLine("-----------------------------");
  11. Cooking guangdong = new GuangdongFood();
  12. Decorator soup = new Soup(guangdong);
  13. Decorator sauce = new Sauce(soup);
  14. sauce.Cook();
  15. Console.ReadLine();
  16. }
  17. }

如需源码请点击 DecoratorPattern.rar 下载。

本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/827092

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

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

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

  2. 极速理解设计模式系列:4.原型模式(Prototype Pattern)

    四个角色:抽象原型角色(Prototype).具体原型角色(ConcretePrototype).原型管理器角色(PrototypeManager).客户端角色(Client) 抽象原型角色(Prot ...

  3. 极速理解设计模式系列:7.桥接模式(Bridge Pattern)

    四个角色:抽象类(Abstraction).扩充抽象类(RefinedAbstraction).实现类接口(Implementor).具体实现类(ConcreteImplementor) 抽象类(Ab ...

  4. 极速理解设计模式系列:22.状态模式(State Pattern)

    四个角色:抽象状态类(State).具体状态类(ConcreateState).情景类(Context).客户端(Client) 抽象状态类(State):提供一个与情景类有关的State行为. 具体 ...

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

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

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

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

  7. 极速理解设计模式系列【目录索引】

    这是一个老生常谈的设计模式系列文章,本系列力图从最简洁的语言和最易理解的实例来让大家认识设计模式的思想和思路,从而在实际项目中能够用到一二.现在将本系列文章详列如下: 极速理解设计模式系列:1.建造者 ...

  8. 设计模式之【装饰器模式】

    和表妹去喝奶茶 表妹:哥啊,我想喝奶茶. 我:走啊,去哪里喝? 表妹:走,我带你去,我经常去的那家,不但好喝,还可以自由搭配很多小料.我每次都是不同的搭配,换着喝,嘻嘻. 我:你倒是挺会喝的嘛~ 你看 ...

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

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

最新文章

  1. python中约瑟夫环程序_Python实现约瑟夫环问题的方法
  2. @value 数组_SpringBoot @Value 读取配置,太强大了!
  3. 设置session失效的几种方法
  4. Android 生成随机数,获取一条随机字符串
  5. 字符和字符串在Java中的旅程
  6. JavaEE学习12--JDBC(上)
  7. html5 sessionStorage 与 localStorage存储
  8. Qt网络编程-简易版UDP单播通信入门Demo(3)
  9. 官方验证!雨林木风 Ghost XP SP3 装机版 ylmf_xp3_yn9.8 !!附:官方全部MD5!
  10. office插件开发_linux常用软件(开发设计必备)
  11. 无人机+AI人工智能可以实现哪些领域的场景应用?
  12. fusioncharts的打印管理(printManager)
  13. openfoam学习心得——openfoam编程进阶
  14. 青春不散场,CSDN毕业季有奖征文开启啦~~
  15. 2021年中国A2P(应用程序对个人)消息传递市场趋势报告、技术动态创新及2027年市场预测
  16. 实现word文档在线编辑
  17. win7用软激活后今天失效,解决办法
  18. STM32的SWD调试方式
  19. 汇集YOLO系列经典和前沿算法,实现高精度实时检测!
  20. CdSe/ZnTe Ⅱ型核壳量子点/核壳型功能/SiC碳化硅量子点的合成

热门文章

  1. AI 四巨头 Google、DeepMind、Microsoft、Uber 深度学习框架大比拼
  2. 不做“浮冰”,深挖AI技术和场景
  3. 一篇文章搞懂人脸识别的十大过程
  4. 人脸识别进校园引争议 “人工智能+教育”应审慎
  5. 国内自动驾驶公司争先入局Robotaxi
  6. SAP MM MB5L 报表里的差异金额如何调整?
  7. FaceBook AI大牛贾扬清传离职,将加入中国公司
  8. 国内丨中国人工智能标准化体系建设提速
  9. 人工智能克服了类脑硬件的绊脚石
  10. 机器学习揭示了人类大脑的新见解