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

6.3 小菜扮靓第二版

过了不到十分钟,小菜的第二版代码出炉。

代码结构图

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("垮裤 ");
    }
}
//其余类类似,省略
…………

客户端代码

static void Main(string[] args)
{
    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();
}

结果显示同前例,略。

“这下你还能说我不面向对象吗?如果要加超人装扮,只要增加子类就可以了。”

“哼,用了继承,用了抽象类就算是用好了面向对象了吗?你现在的代码的确做到了‘服饰’类与‘人’类的分离,但其他问题还有存在的。”

“什么问题呢?”

“你仔细看看这段代码。”

    dtx.Show();
    kk.Show();
    pqx.Show();
    xc.Show();

“这样写意味着什么?”大鸟问道。

“就是把‘大T恤’、‘垮裤’、‘破球鞋’和‘装扮的小菜’一个词一个词的显示出来呀。”

“说得好,我要的就是你这句话,这样写就好比:你光着身子,当着大家的面,先穿T恤,再穿裤子,再穿鞋,仿佛在跳穿衣舞。难道你穿衣服都是在众目睽睽下穿的吗?”

“你的意思是,应该在内部组装完毕,然后再显示出来?这好像是建造者模式呀。”

“不是的,建造者模式要求建造的过程必须是稳定的,而现在我们这个例子,建造过程是不稳定的,比如完全可以内穿西装,外套T恤,再加披风,打上领带,皮鞋外再穿上破球鞋;当然也完全可以只穿条裤衩就算完成。换句话就是说,通过服饰组合出一个有个性的人完全可以有无数种方案,并非是固定的。”

“啊,你说得对,其实先后顺序也是有讲究的,如你所说,先穿内裤后穿外裤,这叫凡人,内裤穿到外裤外面,那就是超人了。”

“哈,很会举一反三嘛,那你说该如何办呢?”

“我们需要把所需的功能按正确的顺序串联起来进行控制,这好像很难办哦。”

“不懂就学,其实也没什么稀罕的,这可以用一个非常有意思的设计模式来实现。”