标签:
星巴兹(Starbuzz)是以扩张速度最快而闻名的咖啡连锁店之一,因为扩张速度实在太快,他们准备更新订单系统,以合乎他们的饮料供应要求。他们原来的设计是这样的……
购买咖啡时,也可以在其中加入各种饮料。例如:蒸奶(Steamed Milk)、豆浆(Soy)、摩卡(Mocha,也就是巧克力)或覆盖奶泡。星巴兹会根据所加入的饮料收取不同的费用。
这简直是“类”爆炸,干嘛设计这么多类,可以利用实例变量和继承追踪这些调料呀!先从Beverage基类下手,加上实例变量代表是否加上饮料(牛奶、豆浆、摩卡、奶泡……)
Beverage类中的cost()不再是个抽象方法,提供了它的实现,计算要加入各种饮料的调料价钱。子类覆盖cost()并扩展其功能,把指定的饮料类型的价钱加进来。然而,这种设计存在着问题:若有其它类型的饮料加进来,需要在Beverage类中假如成员变量,并生成setteer/getter方法,需要再写个子类继承它,这违背了重要的设计原则:类应该对扩展开放,对修改关闭。也就是说子类可以扩展父类Beverage,但不能修改其内部结构。
标签:
原文地址:http://www.cnblogs.com/devotion/p/5411013.html