`
jtlyuan
  • 浏览: 66984 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

装饰模式--Decorator pattern

 
阅读更多

定义:动态地给一个对象增加其他职责,就增加对象的功能来说,装饰模式比生成子类实现更为灵活。

UML图如下:



 

Code:
  1. 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象和抽象装饰器。   
  2. 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。   
  3. 抽象装饰(Decorator)角色:持有一个构件(Component)对象的实例,以用来对它进行装饰,并定义一个与抽象构件接口一致的接口。   
  4. 具体装饰(Concrete Decorator)角色:负责给构件对象"加上"附加的功能。  
  5.   
  6. 结构图代码:  
  7.     //抽象构件,定义了具体构件和抽象装饰要实现的方法  
  8.     interface Component  
  9.     {  
  10.         void Operation();  
  11.     }  
  12.     //定义具体构件  
  13.     class ConcreteComponent : Component  
  14.     {  
  15.         public void Operation()  
  16.         {  
  17.             Console.WriteLine("ConcreteComponent Operation");  
  18.         }  
  19.     }  
  20.     //定义抽象装饰者。抽象装饰者也实现了抽象构件的接口  
  21.     abstract class Decorator : Component  
  22.     {  
  23.         //把一个抽象构件作为抽象装饰的成员变量。  
  24.         protected Component comp;  
  25.        //在抽象装饰者的构造函数中为抽象构件初始化。   
  26.         public Decorator(Component c)  
  27.         {  
  28.             this.comp = c;  
  29.         }  
  30.        //还未实现的接口的方法。   
  31.         public abstract void Operation();  
  32.     }  
  33.     //具体装饰者A,继承自抽象装饰。  
  34.     class ConcreteDecoratorA : Decorator  
  35.     {  
  36.         private string addedState; //具体装饰者中新增的成员变量  
  37.         public ConcreteDecoratorA(Component c) : base(c) { }  
  38.         public string AddedState   //具体装饰者中新增的属性  
  39.         {  
  40.             set  
  41.             {  
  42.                 addedState = value;  
  43.             }  
  44.         }  
  45.        //具体装饰者实现了接口中定义的方法   
  46.         public override void Operation()  
  47.         {  
  48.             comp.Operation();    //可以调用原构件对象的Operation方法。  
  49.             Console.WriteLine("ConcreteDecoratorA Operation {0}",addedState);  
  50.         }  
  51.     }  
  52.     //具体装饰者B,继承自抽象装饰。  
  53.     class ConcreteDecoratorB : Decorator  
  54.     {  
  55.         public ConcreteDecoratorB(Component c) : base(c) { }  
  56.         public override void Operation()  
  57.         {  
  58.             comp.Operation(); //可以调用原构件对象的Operation方法。  
  59.             Console.WriteLine("ConcreteDecoratorB Operation ");  
  60.         }  
  61.        // 具体装饰者实现了接口中定义的方法   
  62.         public void AddedBehavior()  
  63.         {  
  64.             Console.WriteLine("This is Added Behavior");  
  65.         }  
  66.     }  
  67.     class Client  
  68.     {  
  69.         public static void Main()  
  70.         {  
  71.             //原生的具体构件   
  72.             ConcreteComponent cc = new ConcreteComponent();  
  73.             cc.Operation();  
  74.             //把原生的具体构件用具体装饰者A进行一次包装  
  75.             ConcreteDecoratorA cda = new ConcreteDecoratorA(cc);  
  76.             cda.AddedState = "Decorator OK ";  
  77.             cda.Operation();  
  78.            //把原生的具体构件用具体装饰者B进行一次包装   
  79.             ConcreteDecoratorB cdb = new ConcreteDecoratorB(cc);  
  80.             cdb.AddedBehavior();  
  81.             cdb.Operation();  
  82.            //把被A包装完的具体构件再用用具体装饰者B进行二次包装   
  83.             ConcreteDecoratorB cdbcda = new ConcreteDecoratorB(cda);  
  84.             cdbcda.Operation();  
  85.         }  
  86.     }  
  87.  Decorator与Component之间既是Is a...的继承关系,又是Has a...的组合关系。使用具体装饰类(ConcreteDecorator)来装饰具体构件对象(ConcreteComponent),装饰完的对象依旧是个Component类型。
        Decorator模式解决的是类的功能的多向扩展,而不是单纯的类的继承。
        Decorator模式提供了比继承更灵活的功能扩展,通过使用不同具体装饰对构件对象的排列组合地包装,能够不同功能的组合。

 

  • 大小: 432.9 KB
分享到:
评论

相关推荐

    通过C#实现设计模式-装饰模式(DecoratorPattern).rar

    装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你向一个现有的对象添加新的功能,同时又不改变其结构。装饰模式通过创建一个装饰类,该类包装了原始类的实例,并在调用原始类方法之前或之后添加额外的...

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    design-pattern-java.pdf

    树形结构的处理——组合模式(二) 树形结构的处理——组合模式(三) 树形结构的处理——组合模式(四) 树形结构的处理——组合模式(五) 装饰模式-Decorator Pattern 扩展系统功能——装饰模式(一) 扩展系统...

    Design Pattern - Decorator

    装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时给对象添加新的行为或职责,同时保持对象的接口不变。这种模式的核心在于,它动态地将责任附加到对象上,通过将对象包装在一个装饰类中来扩展...

    c++-设计模式之装饰模式(Decorator)

    装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...

    装饰者模式(Decorator Pattern)原理图

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它的定义是在不改变原有对象结构的基础上,动态地给该对象增加一些职责(即增加其额外功能)。这种模式允许向一个现有的对象添加新的功能,同时又不改变其...

    C#设计模式之Decorator 装饰模式

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...

    Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许我们向对象添加新的行为或职责,而无需修改对象的原始代码。在C++中实现装饰者模式,可以让我们灵活地扩展对象的功能,同时保持代码的可读性和可维护性...

    java Decorator装饰模式例子

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...

    java设计模式---诙谐易懂版

    代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法...装饰模式(Decorator Pattern)、迭代器模式(Iterator Pattern)、组合模式(Composite Pattern)、观察者模式(Observer Pattern)、责任链...

    DecoratorPattern.rar

    在"DecoratorPattern.rar"这个压缩包中,包含了装饰器模式的简单案例demo和一个使用MindMaster绘制的脑图。通过这个案例,我们可以深入理解装饰器模式的工作原理和应用场景。 1. 装饰器模式的基本结构: - ...

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...

    装饰器(Decorator)模式

    在《Element of Reusable Object-Oriented Software》中,GOF 对装饰器模式的用意进行了概述:Decorator Pattern――Attaches additional responsibilities to an object dynamically. Decorators provide a ...

    设计模式---装饰者模式

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的...通过阅读和实践 DecoratorPattern 文件中的示例代码,你可以更深入地理解装饰者模式的工作原理及其在实际项目中的应用。

    设计模式 - Design Pattern

    - 装饰(Decorator):动态地给一个对象添加一些额外的职责,提供比继承更灵活的功能扩展。 - 代理(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 3. **行为型模式**:关注对象之间的责任分配,如:...

    C++11全套设计模式-23种指针的用法(a full DesignPattern -DesignPattern.zip

    7. **装饰器模式(Decorator)**:动态地给一个对象添加一些额外的职责。C++11的模板元编程和继承可以实现装饰器模式。 8. **适配器模式(Adapter)**:将一个类的接口转换成客户希望的另一个接口。C++11的类型转换...

Global site tag (gtag.js) - Google Analytics