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

简介:

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

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

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

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

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

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

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

类图: 

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

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

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

        一、部件(Component)

 


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

        二、具体部件(ConcreteComponent)

 


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

        三、装饰抽象类(Decorator)

 


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

        四、具体装饰对象(ConcreteDecorator)

 


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

        五、客户端(Client)

 


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

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



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

相关文章
|
3月前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
41 0
|
20天前
|
设计模式 前端开发 JavaScript
前端必须掌握的设计模式——装饰器模式
装饰器模式是一种结构型设计模式,通过创建新类来包装原始对象,实现在不修改原有结构的前提下扩展新行为。其核心在于“组合”思想,使新功能可“即插即拔”。该模式具有解耦性、灵活性和动态性等特点,广泛应用于类的面向对象编程语言中,如JavaScript的注解和TypeScript的写法。示例中,通过装饰器模式为游戏角色动态添加装备,展示了其强大的扩展性和灵活性。
|
4月前
|
设计模式 Java
Java设计模式-装饰器模式(10)
Java设计模式-装饰器模式(10)
|
4月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
4月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
7月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
8月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
|
7月前
|
设计模式 Java
Java设计模式:深入装饰器模式的三种写法(六)
Java设计模式:深入装饰器模式的三种写法(六)
|
7月前
|
设计模式 架构师 安全
设计模式第五讲-装饰器模式和代理模式详解
远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。
284 0
|
3天前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。