装饰模式
定义:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能
例子:假设现在有个中国人要体现出他会说英文和日文,这时候怎么办?
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方
由此可见:装饰模式的好处:当系统需要有新的功能的时候,向旧的类添加新的代码,新加的代码往往会装饰原来类的核心职责和主要行为。
优点:有效的将类中的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。
浙公网安备 33010602011771号