继承可以在复用父类代码的情况下扩展父类的功能,但同时继承增加了对象之间的耦合度,所以要慎用继承。那么有没有既能扩展父类的功能,又能使对象间解耦的方法呢?答案是肯定的,这就是我们今天要学习的装饰者模式。待会你会看到我会用装饰者模式组装一台电脑。不过现在还是先把书上的例子学习一下。
学习书上的例子
Starbuzz咖啡店的系统需要更新一下,他们原来的系统是这样的:
可以看到,顾客购买饮料时有具体的子类提供并返回饮料的价格。购买咖啡时,可以在其中加入一些调料,比如蒸奶(Steamed Milk)、豆浆(Soy)、摩卡(Mocha,也就是巧克力风味)或覆盖奶泡。Starbuzz会根据所加入的调料收取不同的费用。那么这怎么做呢?也许我们会想到这样的几种解决方法:
1.列出所有的饮料和调料的组合方式。好吧,我想没有人会这么做,这样组合情况太多,用书上的一种说法叫“类爆炸”。
2.在Beverage类中设置各种调料的boolean值以表示是否需要这种调料,如boolean milk, 然后用cost计算出加入各种调料后的价格,然后在子类的cost方法中调用父类的cost方法并加上饮料本身的价格。
分析第2中情况:听起来还不错,但一旦加入新的调料就得修改Beverage类。如果研究出了一种新型的饮料,里面的某些调料可能并不合适,这样导致了饮料拥有加入不合适的调料的方法,这样有什么后果,这样可能会出现一些不好的后果,我们在
延伸阅读
学习是年轻人改变自己的最好方式