什么是装饰模式?
装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
适用范围
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。不改变接口的前提下,增强所考虑的类的性能。
何时使用:
1)需要扩展一个类的功能,或给一个类增加附加责任。 2)需要动态的给一个对象增加功能,这些功能可以再动态地撤销。 3)需要增加一些基本功能的排列组合而产生的非常大量的功能,从而使继承变得 不现实。
角色构成
抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类
装饰角色(Decorator):持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(ConcreteDecorator):负责给构件对象“贴上”附加的责任
结构图
代码
public class Person { public Person() { } private string name; public Person(string name) { this .name = name; } public virtual void Show() { Console.WriteLine("装扮的{0}",name); } }
//抽象装扮 class Finery : Person { protected Person component; //打扮 public void Decorate(Person componnent) { this.component = componnent; } public override void Show() { if (component != null) { component.Show(); } }
//具体服饰类 class Tshirt : Finery { public override void Show() { Console.WriteLine("T恤"); base.Show(); } } class BigTrouse : Finery { public override void Show() { Console.WriteLine("垮裤"); base.Show(); } }
客户端
public static void Main(String[] args) { Person zy = new Person("小菜"); Console.WriteLine("第一种装扮"); Tshirt T = new Tshirt(); BigTrouse B = new BigTrouse(); T.Decorate(zy); B.Decorate(T); B.Show(); Console.WriteLine();