设计模式-装饰模式
前言:
 装饰模式和人穿衣打扮是差不多的,人类穿衣打扮都需要一个更衣室或者是商场的试衣间。都是在隐秘的空间里打扮后之后再展示出自己的搭配,而今天这装饰模式和试衣服是一样的。都需要在后台进行然后在展示时出来结果!
需求:
 小菜有各种各样的服饰,鞋子和装饰品。小菜可以利用装饰模式,用自己已有的服饰对自己进行打扮。
 类图:
 解释:(装饰类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();//调用具体的装饰对象
        }
    }
结果:
 
 总结:
 可以和第一版,第二版做下对比,很明显的可以看到第一版是违反开放封闭原则的不利于扩展。第二版虽然遵循了开放封闭性原则但是没有私密性 ,相当于在大街上当着所有人的面换衣服。第三版既做到了易扩展,还有私密性。 虽然最后展示的结果相同,但是后面的思路不同。
    欢迎访问csdn的博客:
https://blog.csdn.net/kangshihang1998?spm=1010.2135.3001.5343
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号