上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恤,再加披风,打上领带,皮鞋外再穿上破球鞋;当然也完全可以只穿条裤衩就算完成。换句话就是说,通过服饰组合出一个有个性的人完全可以有无数种方案,并非是固定的。”
“啊,你说得对,其实先后顺序也是有讲究的,如你所说,先穿内裤后穿外裤,这叫凡人,内裤穿到外裤外面,那就是超人了。”
“哈,很会举一反三嘛,那你说该如何办呢?”
“我们需要把所需的功能按正确的顺序串联起来进行控制,这好像很难办哦。”
“不懂就学,其实也没什么稀罕的,这可以用一个非常有意思的设计模式来实现。”