定义:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能
例子:假设现在有个中国人要体现出他会说英文和日文,这时候怎么办?
public abstract class People { public abstract void Say(); } public class Chinese : People { public override void Say() { Console.WriteLine("我是中国人"); } }
如果体现说日文的话,要重新再写一个子类,如果是N个就要写N个子类,显得不合理。
改造:
public abstract class People { public abstract void say(); } public class Chinese : People { public override void say() { Console.WriteLine("我是中国人"); } } public abstract class Decorator : People { public People people; public Decorator(People p) { this.people = p; } public override void say() { people.say(); } } public class English : Decorator { public English(People p) : base(p) { } public override void say() { base.say(); //新的行为 SayEnglish(); } public void SayEnglish() { Console.WriteLine("我会讲英语"); } } public class Jan : Decorator { public Jan(People p) : base(p) { } public override void say() { base.say(); SayJan(); } public void SayJan() { Console.WriteLine("我会讲日文"); } }
发现使用装饰模式可以减少类的实现,也可以实现代码组合:例如:
Jan j = new Jan(new English(new Chinese())); j.say();
English它继承了Decorator类又构造了people,我们实例化Englist也会传入一个抽象people(创建中国人的实例)进来,这样我们就可以调用Say和SayEnglish方
由此可见:装饰模式的好处:当系统需要有新的功能的时候,向旧的类添加新的代码,新加的代码往往会装饰原来类的核心职责和主要行为。
优点:有效的将类中的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。