三、装饰模式(Decorator Pattern)

一、概念

装饰者模式:装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

二、说明

    /// <summary>
    /// 运动员入场前 穿戴服装,装备
    /// </summary>
    public class SportsMan
    {
        /// <summary>
        /// 运动员姓名
        /// </summary>
        public string SportsMan_Name { get; set; }


        public void show()
        {
            Console.WriteLine("运动员 {0} 的衣服装备以穿戴完毕,检查无问题!! ",SportsMan_Name);
        }
    }


    //上面已经完成了运动员入场前,服装装备的准备检查工作。
    //现在需求发生变化,要求细化装备穿戴功能即体现穿戴装备的过程。
    //运用面向对象的思维方式,根据开放封闭原则,首先不能在原类SportsMan直接进行添加。
    //对穿戴衣服装备进行抽象,就是都是 穿戴 某个东西,只不过穿戴的方法不同而已。
    //因此我们首先建立一个服饰接口


    /// <summary>
    /// 穿戴运动衣物
    /// </summary>
    public interface SportsFinery
    {
        //穿衣服
        void Vest();
    }


    /// <summary>
    /// 穿T恤
    /// </summary>
    public class TShirts : SportsFinery
    {
        public void Vest()
        {
            Console.WriteLine("穿T恤");
        }
    }


    /// <summary>
    /// 穿短裤
    /// </summary>
    public class WearShorts : SportsFinery
    {
        public void Vest()
        {
            Console.WriteLine("穿短裤");
        }
    }


    //static void Main(string[] args)
    //{
    //SportsFinery tShirts = new TShirts();
    //tShirts.Vest();
    //SportsFinery shorts = new WearShorts();
    //shorts.Vest();
    //SportsMan sm = new SportsMan();
    //sm.SportsMan_Name = "张三";
    //sm.show();
    //Console.ReadKey();
    //}


    //快过年了,又有了新的需求,俱乐部要拍一个宣传片,要求几个明星运动员,穿戴完装备走出更衣室时
    //对着放在更衣室歪的摄像机说一声“祝全国人民新年快乐!” 


    //我们有两种方法可以解决这个问题,一种是新建一个SportsMan的子类,重写show()方法。
    //如果任何修改我们都要建立子类,那最终会造成代码的臃肿,而且有些功能不是提前确定好的,是用户在使用过程中动态添加的,
    //就好比上面的示例,普通运动员不用说,只有明星运动员才需要说。
    //这些可有可无的代码和 核心代码混合在一起,时间长了以后对我们维护会造成变,比如有些代码可能就用一次,用完就可以去除,
    //使用正常的继承来写程序的话,可能会造成不变。
    //因此在我们引入Decorator Pattern(装饰模式),就好比一个房子已经建好,装修完成,人已经住进去了。现在要过节,我们需要在门口挂两个灯笼,
    //过完节可能又会去掉。这个功能是对主体功能的一个装饰,和主体功能是完全独立的。


    public class SportsDecorator : SportsMan
    {
        private SportsMan Sman;


        public SportsDecorator(SportsMan sman)
        {
            this.Sman = sman;
        }


        public void Greeting()
        {
            Console.WriteLine("{0}在此祝全国人民新年快乐!", Sman.SportsMan_Name);
        }
    }


    //static void Main(string[] args)
    //{
        //SportsFinery tShirts = new TShirts();
        //tShirts.Vest();
        //SportsFinery shorts = new WearShorts();
        //shorts.Vest();
        ////普通运动员
        //SportsMan Normal_Sporter = new SportsMan();
        //Normal_Sporter.SportsMan_Name = "张三";
        //Normal_Sporter.show();
        ////超级巨星
        //SportsMan sm = new SportsMan();
        //sm.SportsMan_Name = "乔丹";
        //sm.show();
        //SportsDecorator Sd = new SportsDecorator(sm);//超级巨星——动态添加
        //Sd.Greeting();
            
        //Console.ReadKey();


    //}

猜你喜欢

转载自blog.csdn.net/xiangwenfly/article/details/54091177