装饰模式
定义:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能
例子:假设现在有个中国人要体现出他会说英文和日文,这时候怎么办?
public abstract class People { public abstract void Say(); } public class Chinese : People { public override void Say() { Console.WriteLine("我是中国人"); } }
如果体现说日文的话,要重新再写一个子类,如果是N个就要写N个子类,显得不合理。
改造:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 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( "我会讲日文" ); } } |
发现使用装饰模式可以减少类的实现,也可以实现代码组合:例如:
1 2 | Jan j = new Jan( new English( new Chinese())); j.say(); |
English它继承了Decorator类又构造了people,我们实例化Englist也会传入一个抽象people(创建中国人的实例)进来,这样我们就可以调用Say和SayEnglish方
由此可见:装饰模式的好处:当系统需要有新的功能的时候,向旧的类添加新的代码,新加的代码往往会装饰原来类的核心职责和主要行为。
优点:有效的将类中的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。
1 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步