一、定义
装饰者模式:动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式比生成子类更为灵活。
Decorator模式的工作原理是:可以创建始于Decorator对象(负责新的功能的对象)终于原对象的一个对象“链”。
二、实例:手机屏幕装饰
2.1 手机
public abstract class Phone { public abstract void Print(); } public class Apple : Phone { public override void Print() { Console.WriteLine("我是苹果手机"); } }
2.2 装饰者
这里的关键就是形成一个链
public abstract class BaseDecorator : Phone { public Phone phone; public BaseDecorator(Phone p) { phone = p; } public override void Print() { if (phone != null) { phone.Print(); } } }
public class Screen:BaseDecorator { public Screen(Phone p) : base(p) { } public override void Print() { Decorat(); base.Print(); } private void Decorat() { Console.WriteLine("屏幕装饰."); } } public class Num : BaseDecorator { public Num(Phone p) : base(p) { } public override void Print() { Decorat(); base.Print(); } private void Decorat() { Console.WriteLine("键盘装饰."); } }
2.3 客户端
//-----------------------装饰模式--------------------- Decorator.Phone phone = new Decorator.Apple(); Decorator.BaseDecorator screen = new Decorator.Screen(phone); Decorator.BaseDecorator num = new Decorator.Num(screen); num.Print(); Console.ReadKey();
运行时多态,首先有手机而且是一部苹果手机,接下来我要装饰这部手机的屏幕(贴个膜?),然后再去在按键上做装饰(贴个钻?)
当我们执行 按键的输出—>输出“键盘装饰”—>而后转入父类的输出函数—>键盘的父类是Screen—>此时执行父类的输出函数,“屏幕装饰”—>以此类推直到对象本身
三、总结
装饰模式将多态在运行时运用得很巧妙,实现了装饰链,从最小到最外层的层层装饰。这样的设计可以更好的拓展我们的类的功能。