标签:
1.定义
Attach additonal responsibilities to an object dynamically keeping the same interface,Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更为灵活。)
2.模式说明
(1)Component抽象构件
Component是一个接口或者是抽象类,就是定义我们最核心的对象
(2)ConcreteComponent具体构件
ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是它。
(3)Decorator装饰角色
一般是抽象类,实现接口或抽象方法,在它的属性里必须有一个Private变量指向component抽象构件。
(4)具体的装饰角色
3.代码实现
/// <summary> /// 抽象构件 /// </summary> public abstract class Component { public abstract void Operate(); } /// <summary> /// 具体的构件 /// </summary> public class ConcreteComponent : Component { public override void Operate() {
//如果你直接这样告诉你妈妈,估计不得打死也会骂死,所以我们要对它进行修饰。 Console.WriteLine("妈妈妈妈,我只考到70分。"); } } public abstract class Decorator : Component { private Component _component; public Decorator(Component component) { _component = component; } public override void Operate() { _component.Operate(); } } public class ConcreteDecorator1 : Decorator { public ConcreteDecorator1(Component component) :base(component) { } private void DecoratorMethod1() { Console.WriteLine("妈妈妈妈,我班上最高的也才75分。"); } public override void Operate() { DecoratorMethod1(); base.Operate(); } } public class ConcreteDecorator2 : Decorator { public ConcreteDecorator2(Component component) : base(component) { } private void DecoratorMethod2() { Console.WriteLine("妈妈妈妈,我在班上排10多名呢。"); } public override void Operate() { DecoratorMethod2(); base.Operate(); } }
/// <summary> /// 场景类 /// </summary> class Program { private static void Main(string[] args) { Component component = new ConcreteComponent(); component = new ConcreteDecorator1(component); component = new ConcreteDecorator2(component); component.Operate(); Console.ReadKey(); } }
4.装饰模式的优缺点
(1)优点
.装饰类和被装饰类可以独立发展,而不会相互耦合。换句话说,Component类无须知道Decorator类,Decorator类是从外部来扩展Component类的功能,而Decorator也不用知道具体的构件。
.装饰模式是继承关系的一个替代关系。我们看装饰类Decorator,不管装饰多少层,返回的对象还是Component,实现的还是is-a的关系。继承是静态地给类增加功能,而装饰模式则是动态地增加功能。
.装饰模式可以动态地扩展一个实现类的功能。
(2)缺点
多层装饰是比较复杂的。因此,尽量减少装饰类的数量,以便降低系统的复杂度。
标签:
原文地址:http://www.cnblogs.com/JustYong/p/4588572.html