设计模式-装饰模式

前言:
装饰模式和人穿衣打扮是差不多的,人类穿衣打扮都需要一个更衣室或者是商场的试衣间。都是在隐秘的空间里打扮后之后再展示出自己的搭配,而今天这装饰模式和试衣服是一样的。都需要在后台进行然后在展示时出来结果!

需求:
小菜有各种各样的服饰,鞋子和装饰品。小菜可以利用装饰模式,用自己已有的服饰对自己进行打扮。
类图:
解释:(装饰类Finey继承与人person 类。Finey子类都是一些具体的服饰!)
在这里插入图片描述
**实现:
Person(要装饰的对象,就是给谁打扮)

 public class Person
    {
        public Person()
        {

        }
        private string name;
        /// <summary>
        /// 人名
        /// </summary>
        /// <param name="name"></param>
        public Person(string name)
        {
            this.name = name;
        }//end Person
        /// <summary>
        /// 显示穿的衣服
        /// </summary>
        public virtual void Show()
        {
            Console.WriteLine("装扮的{0}", name);
        }//end Show
    }//end class Person

Finery(服饰的抽象类,定义打扮对象的初始化。)继承与Person类


    /// <summary>
    /// 服饰的抽象类
    /// </summary>
  public  class Finery:Person
    {
        protected Person component;
        /// <summary>
        /// 打扮
        /// </summary>
        /// <param name="component">打扮的对象</param>
        public void Decorate(Person component)
        {
            this.component = component;
        }
        /// <summary>
        /// 显示具体衣服的抽象方法
        /// </summary>
        public override void Show()
        {
            //重写show里执行的具体内容
            if (component!=null)
            {
                component.Show();
            }//end if

        }
    }

具体的服饰:(Finery的子类)
垮裤

  public  class BigTrouser:Finery
    {
        public override void Show()
        {
            Console.WriteLine("垮裤");
            base.Show();//调用具体的装饰对象
        }
    }

领带

 public class public_WerTie:Finery
    {
        public override void Show()
        {

            Console.WriteLine("领带");
            base.Show();//调用具体的装饰对象
        }
    }

运动鞋

 public    class Sneakers:Finery
    {
        public override void Show()
        {
            Console.WriteLine("运动鞋");
            base.Show();//调用具体的装饰对象
        }
    }

T-血

  /// <summary>
    /// 服饰的子类,T-血
    /// </summary>
public  class Tshirts:Finery
    {
        /// <summary>
        /// 重新父类方法
        /// </summary>
        public override void Show()
        {
            Console.WriteLine("大T-血");
            base.Show();//调用具体的装饰对象
        }//end Show
    }

西装

 public class WeraSuit:Finery
    {
        public override void Show()
        {
            Console.WriteLine("西装");
            base.Show();//调用具体的装饰对象
        }
    }

皮鞋

  public  class WerLeatherShoes:Finery
    {
        public override void Show()
        {
            Console.WriteLine("皮鞋");
            base.Show();//调用具体的装饰对象
        }
    }

破球鞋

 public  class Wersneakers:Finery

    {
        public override void Show()
        {
            Console.WriteLine("破球鞋");
            base.Show();//调用具体的装饰对象
        }
    }

结果:
在这里插入图片描述
总结:
可以和第一版,第二版做下对比,很明显的可以看到第一版是违反开放封闭原则的不利于扩展。第二版虽然遵循了开放封闭性原则但是没有私密性 ,相当于在大街上当着所有人的面换衣服。第三版既做到了易扩展,还有私密性。 虽然最后展示的结果相同,但是后面的思路不同。

posted @ 2019-11-10 20:24  康世行  阅读(24)  评论(0编辑  收藏  举报