装饰模式

来源:互联网 发布:软件工作量估计案例 编辑:程序博客网 时间:2024/04/28 13:13

装饰模式


          装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

          以小菜的穿衣打扮为例,第一版:

<span style="font-size:24px;"><span style="font-size:24px;">#region//小菜第一版//Person类class Person{    private string name;    public Person(string name)    {        this.name = name;    }    public void WearTShirts()    {        Console.Write("大T恤");    }    public void WearBigTrouser()    {        Console.Write("垮裤");    }    public void WearSneakers()    {        Console.Write("破球鞋");    }    public void WearSuit()    {        Console.Write("西装");    }    public void WearTie()    {        Console.Write("领带");    }    public void WearLeatherShoes()    {        Console.Write("皮鞋");    }    public void Show()    {        Console.WriteLine("装扮的{0}", name);    }}#endregion</span></span>
<span style="font-size:24px;"><span style="font-size:24px;">            #region//小菜第一版            Person xc = new Person("小菜");            Console.WriteLine("\n第一种装扮:");            xc.WearTShirts();            xc.WearBigTrouser();            xc.WearSneakers();            xc.Show();            Console.WriteLine("\n第二种装扮");            xc.WearSuit();            xc.WearTie();            xc.WearLeatherShoes();            xc.Show();            Console.Read();            #endregion</span></span>

          此时,如果要添加装扮,就得修改Person类,但是,这就违背了开放封闭的原则,因此,应该把这些服饰都写成子类,第二版:

<span style="font-size:24px;">//Person类class Person{    private string name;    public Person(string name)    {        this.name = name;    }    public void Show()    {        Console.WriteLine("装扮的{0}", name);    }}//服饰抽象类//服饰abstract class Finery{    public abstract void Show();}//各种服饰子类//大T恤class TShirts : Finery{    public override void Show()    {        Console.Write("大T恤");    }}//垮裤class BigTrouser : Finery{    public override void Show()    {        Console.Write("垮裤");    }}//破球鞋class Sneakers : Finery{    public override void Show()    {        Console.Write("破球鞋");    }}//西装class Suit : Finery{    public override void Show()    {        Console.Write("西装");    }}//领带class Tie : Finery{    public override void Show()    {        Console.Write("领带");    }}//皮鞋class LeatherShoes : Finery{    public override void Show()    {        Console.Write("皮鞋");    }}</span>
<span style="font-size:24px;">            #region//小菜第二版            Person xc = new Person("小菜");            Console.WriteLine("\n第一种装扮:");            Finery dtx = new TShirts();            Finery kk = new BigTrouser();            Finery pqx = new Sneakers();            dtx.Show();            kk.Show();            pqx.Show();            xc.Show();            Console.WriteLine("\n第二种装扮:");            Finery xz = new Suit();            Finery ld = new Tie();            Finery px = new LeatherShoes();            xz.Show();            ld.Show();            px.Show();            xc.Show();            Console.Read();            #endregion</span>

          小菜扮靓第三版:

<span style="font-size:24px;">#region//小菜第三版//Person类class Person{    public Person()    { }    private string name;    public Person(string name)    {        this.name = name;    }    public virtual void Show()    {        Console.WriteLine("装扮的{0}", name);    }}//服饰类class Finery : Person{    protected Person component;    //装扮    public void Decorate(Person component)    {        this.component = component;    }    public override void Show()    {        if (component != null)        {            component.Show();        }    }}//具体服饰类class TShirt : Finery{    public override void Show()    {        Console.Write("大T恤");        base.Show();    }}class BigTrouser : Finery{    public override void Show()    {        Console.Write("垮裤");        base .Show ();    }}class Sneakers : Finery{    public override void Show()    {        Console.Write("破球鞋");        base.Show();    }}class Suit : Finery{    public override void Show()    {        Console.Write("西装");        base.Show();    }}class Tie : Finery{    public override void Show()    {        Console.Write("领带");        base.Show();    }}class LeatherShoes : Finery{    public override void Show()    {        Console .Write ("皮鞋");        base.Show();    }}#endregion</span>
<span style="font-size:24px;">            #region//小菜第三版            Person xc = new Person("小菜");            Console.WriteLine("\n第一种装扮:");            Sneakers pqx = new Sneakers();            BigTrouser  kk = new BigTrouser();            TShirt  dtx = new TShirt();            pqx.Decorate(xc);            kk.Decorate(pqx);            dtx.Decorate(kk);            dtx.Show();            Console.WriteLine("\n第二种装扮:");            LeatherShoes px = new LeatherShoes();            Tie ld = new Tie();            Suit xz = new Suit();            px.Decorate(xc);            ld.Decorate(px);            xz.Decorate(ld);            xz.Show();            Console.Read();            #endregion</span>

          装饰模式是为已有功能,动态的添加更多功能的一种方式,当系统需要新功能的时候,是向旧的类中添加新的代码,这些新加的代码,通常装饰了原有类的核心职责或主要行为。

          它们在主类中加入了新的字段,新的方法或新的逻辑,从而增加了主类的负责度,而这些新加入的东西,仅仅是为了满足一些只在某种特定情况下,才会执行的特 殊行为的需要。

          装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要,有选择的、按顺序的使用装饰功能包装对象了。

          装饰模式的优点是,把类中的装饰功能从类中搬移去除,这样可以简化原有的类。这样做得更大好处是,有效的把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。


1 0
原创粉丝点击