一.装饰者模式的定义:

装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

结构:

装饰器UML.png

(1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
(2)具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
(3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
(4)具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。

抽象构件

    /// <summary>/// 手机抽象类,即抽象者模式中的抽象组件类/// </summary>public abstract class Phone{/// <summary>/// 打印方法/// </summary>public abstract void Print();}

具体构件

    /// <summary>/// 苹果手机,即装饰着模式中的具体组件类/// </summary>public class ApplePhone:Phone{/// <summary>/// 重写基类的方法/// </summary>public override void Print(){Console.WriteLine("我有一部苹果手机");}}

装饰角色

    /// <summary>/// 装饰抽象类,让装饰完全取代抽象组件,所以必须继承Phone/// </summary>public abstract class Decorator:Phone{private Phone p ;    //该装饰对象装饰到的Phone组件实体对象public Decorator(Phone p){this.p = p;}public override void Print(){if (this.p != null){p.Print();}}}

具体装饰

    /// <summary>/// 贴膜,具体装饰者/// </summary>public class Sticker:Decorator{public Sticker(Phone p) : base(p) { }public override void Print(){base.Print();//添加行为AddSticker();}/// <summary>/// 新的行为方法/// </summary>public void AddSticker(){Console.WriteLine("现在苹果手机有贴膜了");}}/// <summary>/// 手机挂件,即具体装饰者/// </summary>public class Accessories:Decorator{public Accessories(Phone p) : base(p) { }public override void Print(){base.Print();// 添加新的行为AddAccessories();}/// <summary>/// 新的行为方法/// </summary>public void AddAccessories(){Console.WriteLine("现在苹果手机有漂亮的挂件了");}}

使用

    /// <summary>/// 设计模式-装饰者模式/// </summary>class Program{static void Main(string[] args){Phone ap = new ApplePhone(); //新买了个苹果手机Decorator aps = new Sticker(ap); //准备贴膜组件aps.Print();Decorator apa = new Accessories(ap); //过了几天新增了挂件组件apa.Print();Sticker s = new Sticker(ap);       //准备贴膜组件Accessories a = new Accessories(s);//同时准备挂件a.Print(); }}

优点:

  1. Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
  2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

缺点:

  1. 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
  2. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
  3. 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。

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

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

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

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

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

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

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

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

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

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

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

  6. 装饰器模式--Decorator

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

  7. 装饰器模式 decorator

    所有的说明和解释都在代码中有注释来标明 package mode.decorator;/*** * 这里定义一个接口,在接口中定义我们要执行的操作.* * 以后所有的装饰器以及我们要装饰的对象都要实现 ...

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

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

  9. JAVA设计模式-装饰器模式(Decorator)

    装饰器模式(Decorator) 为了某个实现类在不修改原始类的基础上进行动态地覆盖或者增加方法 采用--------装饰器模式 实现类要保持与原有类的层级关系 装饰器模式是一种特殊的适配器模式 拿适 ...

最新文章

  1. oracle 新增自增字段,SQL server、Oracle中拿到新增列时的自增字段值
  2. linux rpm mysql 路径_linux基础-linux 下 安装 rpm 格式 的 mysql
  3. 黑马程序员pink老师前端入门教程,零基础必看的h5(html5)+css3+移动端前端视频教程(权重,盒子模型)
  4. 《系统集成项目管理工程师》必背100个知识点-86项目总结会议讨论的内容
  5. difference between finance and manufacturing from stakeholder‘s perspective
  6. 997西方行政学说 (2)
  7. 实验心得_大肠杆菌原核表达实验心得(上篇)
  8. 前端学习(2):什么是html和css
  9. eclipse编译java项目class文件_动态编译 Java 代码以及生成 Jar 文件
  10. 移除apt源_apt提示处理归档 (--unpack)时出错的解决办法
  11. https p12证书请求解决问题过程
  12. 西瓜书+实战+吴恩达机器学习(十五)无监督学习之关联分析(Apriori, FP-growth)
  13. Flask框架(一)
  14. 转载关于使用Ant打包Flex的一些脚本
  15. Does Your Wooden Surface Really Need Sealing?
  16. java的第一行代码
  17. hprose for java 教程_Hprose for Java怎么使用?Hprose for Java使用教程
  18. win10 共享文件夹 nplayer查看共享文件
  19. vue 使用高德地图插件 vue-amap
  20. 一篇难得的关于傅里叶分析的好文

热门文章

  1. 点云处理不得劲?球卷积了解一下
  2. 小分子溶液当硬盘!布朗大学逆天研究:用代谢分子存储照片,准确率达99%
  3. clear session on close of browser jsp
  4. keepalived双实例配置
  5. 西霞口船业公司疑遭外商合谋欺诈
  6. python中id3决策树算法_ID3决策树算法实现(Python版)
  7. 设计模式 — 行为型模式 — 命令模式
  8. Android各个文件夹对应的分辨率?
  9. Webservice超时问题
  10. SpringBoot中logback日志保存到mongoDB