装饰器模式

用一个生活中的小场景来描述下装饰器模式比较生动、易懂;

场景:"话说婚后的男人生活可谓是得十八般武器样样精通才行啊,特别是有了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();
        }

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

posted @ 2021-03-03 10:05  _MrZhu  阅读(39)  评论(0)    收藏  举报