装饰模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
Component(被装饰对象基类): 定义对象的接口,可以给这些对象动态增加职责;
ConcreteComponent(具体被装饰的对象): 定义具体的对象,Decorator可以给它增加额外的职责;
Decorator(装饰者抽象类): 维护一个指向Component实例的引用,并且定义了与Component一致的接口;
ConcreteDecorator(具体装饰者): 具体的装饰对象,给内部持有的具体被装饰对象增加具体的职责。
有一句很有道理话,想必大家都听过:没有丑女人,只有懒女人。有一张保养的很好的脸的确能给初次印象加不少的分数。我想大部分女生都知道,每个宿舍都有几个爱臭美的女生,早上起的特别早,在脸上抹了一层又一层,想知道是怎么个顺序吗?下面让我们进入这个小例子:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication9 { class Program//客户端代码 { static void Main(string[] args) { Person xm = new Person("小美"); Console.WriteLine("\n 基础护肤顺序:"); Water shui = new Water(); Lotion ruye = new Lotion(); Sunscreen fangshai = new Sunscreen(); Isolation geli = new Isolation(); //擦护肤品的过程 geli.Decorate(xm); fangshai.Decorate(geli); ruye.Decorate(fangshai ); shui.Decorate(ruye); shui.Show(); } } //Person类(ConcreteComponent) class Person { public Person() { } public string name; public Person(string name) { this.name = name; } public virtual void Show() { Console.WriteLine("的{0}",name ); } } //保养品类(Decorator) class MakeUp : Person { protected Person component; public void Decorate(Person component) { this.component = component; } public override void Show() { if (component !=null) { component.Show(); } } } //具体保养品类(ConcreteDecorator) class Water : MakeUp { public override void Show() { Console.Write("水 "); base.Show(); } } class Lotion : MakeUp { public override void Show() { Console.Write("乳液 "); base.Show(); } } class Sunscreen : MakeUp { public override void Show() { Console.Write("防晒 "); base.Show(); } } class Isolation : MakeUp { public override void Show() { Console.Write("隔离 "); base.Show(); } } }
该例子中运用到了装饰模式,其中特别要注意把所需的功能按照正确的顺序串联起来进行控制,比如例子中这些保养品的顺序是按照分子大小的顺序来涂抹的,小分子的先抹,大分子的后抹,如果顺序颠倒,保湿的进不去,隔离、防晒可能会伤及皮肤。
装饰模式的优点:
1.它把每个要装饰的功能放在单独的类中,简化了原有类,并让这个类包装它所要装饰的对象。因此,当需要执行特殊行为时,客户端代码就可以在运行时根据需要有选择的,按顺序的使用装饰功能包装对象。
2.有效的把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑。
缺点:
1.装饰链不过长,否则会影响效率。
2.通过继承关系建立的关系是脆弱的,如果基类变,势必会影响对象的内部;组合建立的关系只会影响到被装饰对象的外部特征。
3.只有在必要的的时候使用装饰模式,否则会提高程序的复杂性,增加系统维护难度。
联系 策略模式:
装饰模式跟策略模式有很相似的一点就是简化功能,策略模式简化了客户端的代码,将业务逻辑和界面逻辑分开,装饰模式简化了类,将类中的装饰功能从类中搬移去除。
启发:
管理,要分工明确,核心职责突出,不能所有的活都干,要明确大方向,拥有全局观。