读书人

简略易解的装饰模式

发布时间: 2012-07-28 12:25:13 作者: rapoo

简单易解的装饰模式

一、目的:

刚开始看装饰模式的时候有点小晕,看了好几遍,又自己敲上了几遍才有了一些头绪,说白了装饰模式就是用来给某一个对象动态的添加功能或者职责的。

实现的过程中还会用到了里氏替换原则(前提是有多个被装饰者,则有一个抽象的Component类,因为在Decorator中会定义一个Component类型的对象,而在主程序中给他赋值时有可能是具体的某个ConcreteComponent的对象,ConcreteComponent对象是Component的子类,让子类代替父类出场并完成功能即为里氏替换原则) 二、原理: Component:一个抽象类或接口,可以给这些对象动态的添加职责。 ConcreteComponent:定义了一个具体的对象(被装饰者),可以给这个对象添加功能和职责(比如要装饰墙,则墙就是这个对象) Decorator:装饰的抽象类,继承了Component类 ConcreteDecorator:具体的装饰类(某一个具体的功能或指责),继承Decorator类,用来给装饰者ConcreteComponent对象添加装饰。
三、下面直接上代码:拿人穿衣服的实例来分析代码的实现部分1.这是一个ConcreteComponent类,被装饰者类 public class Person { public Person() { }
private string Name; public Person(string name) { this.Name = name; } public virtual void Show() { Console.WriteLine("装扮者是{0}",Name); } }2. 装饰的抽象类Decorator,继承person类,用来给person的具体对象添加装饰用(当然不会直接用的这个类,而是用这个抽象类的子类) public abstract class Decorator:Person { protected Person person = null; public void SetPerson(Person per) { this.person = per; } public override void Show() { if (person!=null) { person.Show(); } } }
3.具体装饰的类ConcreteDecorator,继承Decorator类,用来给被装饰着person的对象添加装饰 public class DecoratorA:Decorator { public override void Show() { Console.WriteLine("高跟鞋"); base.Show(); } }
public class DecoratorB:Decorator { public override void Show() { Console.WriteLine("长裙子"); base.Show(); } }
4.主程序中的代码: static void Main(string[] args) { Person personA = new Person("小红"); DecoratorA a = new DecoratorA(); DecoratorB b = new DecoratorB();
a.SetPerson(personA); b.SetPerson(a); b.Show(); Console.ReadKey(); }
对于装饰者模式可以灵活来用,如上面的代码例子中被装饰者只有一个,则可以省略Component类,直接声明一个ConcreteComponent类(上例中是Person类)即可,而Decorator类直接继承ConcreteComponent类。同样如果要装饰的功能只有一项,则也不用创—ecorator类,直接创建一个ConcreteDecorator类即可。

读书人网 >其他相关

热点推荐