装饰器模式
用一个生活中的小场景来描述下装饰器模式比较生动、易懂;
场景:"话说婚后的男人生活可谓是得十八般武器样样精通才行啊,特别是有了baby之后,周末到了,老婆约闺蜜去逛街,临走之前留下几个任务清单:哄baby入睡、洗衣、做饭、清理房间,必须按照任务清单执行,我擦,一般人能忍吗?一般人有这些能力吗?但是我有这能力啊 谁让哥们我是超人呢"
开始撸码:
先抽象个一般人person类:一般人有啥技能咱也不知道,先抽象着;
public abstract class Person { public string Name { get; set; } //获取技能 public abstract void GetTasks(); }
哥们是超人啊,必须有能力啊
public class SuperMan : Person { public override void GetTasks() { Console.WriteLine("我是超人,但是我不会飞,我会打LOL"); } }
下面是一个“分水岭”了,哥们我现在能力不够啊,怎么获取哄baby入睡、洗衣、做饭、清理房间 这些能力呢?
装饰器登场,好好包装下自己:要包装成什么样,我也不知道,但是我知道我自己之前会“打LOL”,先搞个装饰器基类吧(其实这个基类就是为了实现“组合+继承”)
/// <summary> /// 能力装饰器基类 作用是为了用基类来够着“组合” /// </summary> public class SkillDecoraterBase : Person { protected Person _person = null; public SkillDecoraterBase(Person person) { _person = person; } public override void GetTasks() { _person.GetTasks(); } }
实现具体的装饰能力:
/// <summary> /// 烹饪装饰器 /// </summary> public class CookingDecorater : SkillDecoraterBase { public CookingDecorater(Person person):base(person) { } public override void GetTasks() { base.GetTasks(); Console.WriteLine("做饭"); } } /// <summary> /// 清理房间 /// </summary> public class CleanDecorater : SkillDecoraterBase { public CleanDecorater(Person person) : base(person) { } public override void GetTasks() { base.GetTasks(); Console.WriteLine("清理房间"); } } /// <summary> /// 哄睡baby /// </summary> public class SleepBabyDecorater : SkillDecoraterBase { public SleepBabyDecorater(Person person) : base(person) { } public override void GetTasks() { base.GetTasks(); Console.WriteLine("哄睡Baby"); } } /// <summary> /// 洗衣服 /// </summary> public class WashClothesDecorater : SkillDecoraterBase { public WashClothesDecorater(Person person) : base(person) { } public override void GetTasks() { base.GetTasks(); Console.WriteLine("洗衣服"); } }
展示能力的时候到了
static void Main(string[] args) { Person p = new SuperMan(); p = new SleepBabyDecorater(p); p = new WashClothesDecorater(p); p = new CookingDecorater(p); p = new CleanDecorater(p); p.GetTasks(); Console.ReadKey(); }

“铃铃.....” 老公,把任务清单调整一下,改成:洗衣、清理房间、哄Baby入睡、做饭",我擦这女人啊,善变啊,幸亏哥们未雨绸缪.......走你
static void Main(string[] args) { Person p = new SuperMan(); p = new WashClothesDecorater(p); p = new CleanDecorater(p); p = new SleepBabyDecorater(p); p = new CookingDecorater(p); p.GetTasks(); Console.ReadKey(); }

生活不易,其实没有什么岁月静好,只不过大家都在砥砺前行而已,加油吧,一线撸码的朋友们。

浙公网安备 33010602011771号