一、定义编程
Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。架构
二、意图:app
动态地给一个对象添加一些额外的职责。就增长功能来讲,Decorator模式相比生成子类更为灵活。ide
三、设计原则:性能
1. 多用组合,少用继承。this
利用继承设计子类的行为,是在编译时静态决定的,并且全部的子类都会继承到相同的行为。然而,若是可以利用组合的作法扩展对象的行为,就能够在运行时动态地进行扩展。spa
2. 类应设计的对扩展开放,对修改关闭。设计
四、要点:code
1. 装饰者和被装饰对象有相同的超类型。component
2. 能够用一个或多个装饰者包装一个对象。
3. 装饰者能够在所委托被装饰者的行为以前或以后,加上本身的行为,以达到特定的目的。
4. 对象能够在任什么时候候被装饰,因此能够在运行时动态的,不限量的用你喜欢的装饰者来装饰对象。
5. 装饰模式中使用继承的关键是想达到装饰者和被装饰对象的类型匹配,而不是得到其行为。
6. 装饰者通常对组件的客户是透明的,除非客户程序依赖于组件的具体类型。在实际项目中能够根据须要为装饰者添加新的行为,作到“半透明”装饰者。
7. 适配器模式的用意是改变对象的接口而不必定改变对象的性能,而装饰模式的用意是保持接口并增长对象的职责。
五、实现图
六、具体实例
装饰模式结构图
Component是定义一个对象接口,能够动态给这些对象添加行为职责,ConcreteComponent也是定义了一个具体的对象,也能够给这个对象添加一些职责,Decorator装饰抽象类,继承Component,从外类来扩展Compenent功能,但对于Component来讲,无需知道Decorator的存在。ConcreteDecorator是具体的装饰对象,起到给Component添加职责的功能,具体代码:
(1)定义一个抽象的基类,Component
public abstract class Component { public abstract void operation(); }
(2)定义ConcreteComponent
public class ConcreteComponent : Component { public override void operation() { Console.WriteLine("具体的对象操做"); } }
(3)定义Decorator
public class Decorator : Component { private Component component; public void setComponent(Component com) { this.component = com; } public override void operation() { component.operation(); } }
(4)定义具体的装饰对象
public class ConcreteDecoratorA : Decorator { public void AddOperation() { Console.WriteLine("添加职责A"); } public override void operation() { base.operation(); AddOperation(); } } public class ConcreteDecoratorB:Decorator { public void AddOperation() { Console.WriteLine("添加职责B"); } public override void operation() { base.operation(); AddOperation(); } }
(5)客户段代码
class Program { static void Main(string[] args) { ConcreteComponent com = new ConcreteComponent(); ConcreteDecoratorA d1 = new ConcreteDecoratorA(); ConcreteDecoratorB d2 = new ConcreteDecoratorB(); d1.setComponent(com); d2.setComponent(d1); d2.operation(); Console.ReadLine(); }
适用性:
如下状况使用Decorator模式
1. 须要扩展一个类的功能,或给一个类添加附加职责。
2. 须要动态的给一个对象添加功能,这些功能能够再动态的撤销。
3. 须要增长由一些基本功能的排列组合而产生的很是大量的功能,从而使继承关系变的不现实。
4. 当不能采用生成子类的方法进行扩充时。一种状况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增加。另外一种状况多是由于类定义被隐藏,或类定义不能用于生成子类。
优势:
1. Decorator模式与继承关系的目的都是要扩展对象的功能,可是Decorator能够提供比继承更多的灵活性。
2. 经过使用不一样的具体装饰类以及这些装饰类的排列组合,设计师能够创造出不少不一样行为的组合。
缺点:
1. 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
2. 装饰模式会致使设计中出现许多小类,若是过分使用,会使程序变得很复杂。
3. 装饰模式是针对抽象组件(Component)类型编程。可是,若是你要针对具体组件编程时,就应该从新思考你的应用架构,以及装饰者是否合适。固然也能够改变Component接口,增长新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要作出最佳选择。