欢迎来到星巴兹咖啡
星巴兹(Starbuzz) 是以扩张速度最快而闻名的咖啡连锁店。如果你在街角看到它的店, 在对面街上肯定还会看到另一家。因为扩张速度实在太快了, 他们准备更新订单系统, 以合乎他们的饮料供应要求。
他们原先的类设计是这样的……
![]() |
购买咖啡时, 也可以要求在其中加入各种调料, 例如: 蒸奶(Steamed Milk) 、豆浆(Soy) 、摩卡(Mocha, 也就是巧克力风味) 或覆盖奶泡。星巴兹会根据所加入的调料收取不同的费用。所以订单系统必须考虑到这些调料部分。
这是他们的第一个尝试……
请为下面类的cost()方法书写代码( 用伪Java 代码即可) 。
public class Beverage { public class DarkRoast extends Beverage { public double cost() { |
当哪些需求或因素改变时会影响这个设计?
调料价钱的改变会使我们更改现有代码。
一旦出现新的调料,我们就需要加上新的方法,并改变超类中的cost()方法。
以后可能会开发出新饮料。对这些饮料而言(例如:冰茶),某些调料可能并不适合,但是在这个设计方式中,Tea(茶)子类仍将继承那些不适合的方法,例如:hasWhip()(加奶泡)。
这是很糟糕的!我们在第1章就得到了这个教训。
万一顾客想要双倍摩卡咖啡,怎么办?
轮到你了:
大师与门徒……
大师: 我说蚱蜢呀! 距离我们上次见面已经有些时日, 你对于继承的冥想, 可有精进?
门徒: 是的, 大师。尽管继承威力强大, 但是我体会到它并不总是能够实现最有弹性和最好维护的设计。
大师: 啊! 是的, 看来你已经有所长进。那么, 告诉我, 我的门徒, 不通过继承又能如何达到复用呢?
门徒: 大师, 我已经了解到利用组合(composition) 和委托(delegation) 可以在运行时具有继承行为的效果。
大师: 好, 好, 继续……
门徒: 利用继承设计子类的行为, 是在编译时静态决定的, 而且所有的子类都会继承到相同的行为。然而, 如果能够利用组合的做法扩展对象的行为, 就可以在运行时动态地进行扩展。
大师: 很好, 蚱蜢, 你已经开始看到组合的威力了。
门徒: 是的, 我可以利用此技巧把多个新职责, 甚至是设计超类时还没有想到的职责加在对象上。而且, 可以不用修改原来的代码。
大师: 利用组合维护代码, 你认为效果如何?
门徒: 这正是我要说的。通过动态地组合对象, 可以写新的代码添加新功能, 而无须修改现有代码。既然没有改变现有代码, 那么引进bug 或产生意外副作用的机会将大幅度减少。
大师: 非常好。蚱蜢, 今天的谈话就到这里。希望你能在这个主题上更深入……
牢记, 代码应该如同晚霞中的莲花一样地关闭( 免于改变), 如同晨曦中的莲花一样地开放( 能够扩展) 。
| 回书目 上一节 下一节 |
|
· 第六章 你能帮我吗?.. · Linux笔试面试题选摘测.. · 08年5月软考网管上午真.. · 性能测试从零开始 目录 · 08年5月软考网工上午真.. · 上周拒绝服务攻击(DDo.. |
· 08年5月各大网上书店及.. · 2008年5月24日软考试题.. · 软件设计师专家临考模.. · 上周网络管理员专家自.. · 网络工程师自测获奖名.. · 08年4月各大网上书店及.. |
|
||||
| · NAC安全访问控制 · 网络布线测试仪器 · Windows Server 2008专.. · Windows远程桌面应用 · 网络故障排除宝典 · 运营商封堵ADSL共享 中.. · 解析35岁技术人的价值.. · 世纪枭雄比尔盖茨的王.. |
· 主流品牌防火墙配置 · ASP.NET开发教程 · 超级计算机TOP500专题 · Vista SP1对决XP SP3 · SQL Server 2008/2005.. · 程序员如何成长? · C#技术开发指南 · 虚拟化技术还有点“虚” |
|||
|
||||
| · SOA 面向服务架构 · SQL Server 2008/2005.. · Apache技术专题 · 三层交换技术专题 · SQL Server入门到精通 · Windows远程桌面应用 · C#技术开发指南 · Apache技术专题 |
· Windows集群服务应用 · C#技术开发指南 · 国际文档格式标准开战 · 路由器设置与口令恢复 · Linux 集群技术专题 · PHP开发应用手册 · SOA 面向服务架构 · 企业数据恢复指南 |
|||
|
||||
| · SQL Server入门到精通 · SQL Server 2008/2005.. · SOA 面向服务架构 · Apache技术专题 · C#技术开发指南 · 三层交换技术专题 · Apache技术专题 · C#技术开发指南 |
· Windows远程桌面应用 · 企业数据恢复指南 · Windows集群服务应用 · 路由器设置与口令恢复 · Linux 集群技术专题 · SOA 面向服务架构 · 了解统一威胁管理(UTM).. · 反垃圾邮件技术应用 |
|||