大话设计模式
上QQ阅读APP看书,第一时间看更新

6.5 小菜扮靓第三版

二十分钟后,小菜第三版代码出炉。

代码结构图

“Person”类(ConcreteComponent)

class Person
{
    public Person()
    { }
 
    private string name;
    public Person(string name)
    {
        this.name = name;
    }
 
    public virtual void Show()
    {
        Console.WriteLine("装扮的{0}", name);
    }
}

服饰类(Decorator)

class Finery : Person
{
    protected Person component;
 
    //打扮
    public void Decorate(Person component)
    {
        this.component = component;
    }
 
    public override void Show()
    {
        if (component != null)
        {
            component.Show();
        }
    }
}

具体服饰类(ConcreteDecorator)

class TShirts : Finery
{
    public override void Show()
    {
        Console.Write("大T恤 ");
        base.Show();
    }
}
 
class BigTrouser : Finery
{
    public override void Show()
    {
        Console.Write("垮裤 ");
        base.Show();
    }
}
 
//其余类类似,省略
…………

客户端代码

结果显示

第一种装扮:
大T恤 垮裤 破球鞋 装扮的小菜
 
第二种装扮:
西装 领带 皮鞋 装扮的小菜

“如果我换一种装饰方式,结果会怎样呢?”大鸟改动了小菜的代码。

    Console.WriteLine("\n第三种装扮:");
    Sneakers pqx2 = new Sneakers();
    LeatherShoes px2 = new LeatherShoes();
    BigTrouser kk2 = new BigTrouser();
    Tie ld2 = new Tie();
 
    pqx2.Decorate(xc);
    px2.Decorate(pqx);
    kk2.Decorate(px2);
    ld2.Decorate(kk2);
 
    ld2.Show();

结果就会显示

第三种装扮:
领带 垮裤 皮鞋 破球鞋 装扮的小菜

“哈,光着膀子、打着领带、下身垮裤、左脚皮鞋、右脚破球鞋的极具个性的小菜就展现在我们面前了。”

“你这家伙,又开始拿我开涮。我要这样子,比扮超人还要丢人。”