装饰者模式

第三个模式:装饰者模式架构

3.1 模式引入框架

辛巴克咖啡,购买咖啡时,也能够要求在其中加入各类调料,例如:蒸奶(Steamed milk)、豆浆(soy)、摩卡(Mocha)或者覆盖奶泡。星巴克会根据所加入的调料收取不一样的费用。因此订单系统必须考虑到这些调料部分。 设计

3.2 解决方案1:对象

采用继承来实现方案: blog

wps6647.tmp

这种方案的特色: 继承

1.一旦出现新调料,咱们将须要加上新的方法,并改变超类中的cost()方法; 开发

2.之后开发新的饮料,对这些新饮料而言,某些调料可能并不合适,可是在这个设计方式中,Tea(茶)子类依然继承那些不合适的方法 get

3.万一客户须要双倍摩卡,怎么办?? it

设计原则:类应该对扩展开放,对修改关闭 扩展

wpsE009.tmp

如上所示咱们已经知道继承没法彻底解决咱们想要的问题,容易出现:类数量爆炸、设计死板、以及基类加入的新功能并不适用全部的子类。

3.2 解决方案2:

咱们考虑引入新的方法:咱们要以饮料为主体,而后在运行时以调料来“装饰”饮料。比方说,若是顾客想要摩卡和奶泡深赔咖啡,那么,要作的是:

wps593E.tmp

咱们由此能够知道:

wpsADA5.tmp

由此引入装饰者模型:

装饰者模型:动态地将责任附加到对象上,若要扩张功能,装饰者提供了比继承更有弹性的替代方案。

以下图是装饰者模型的类图:

wps5B5.tmp

下面是星巴克的框架:

wps60B0.tmp

装饰者模型的重点在于:装饰者和被装饰者必须是一致的类型,也就是拥有共同的超类,这是至关关键的地方。在这里咱们利用继承达到了“类型匹配”,而不是利用继承得到“行为”。

具体的实现能够见源代码,o(∩_∩)o 。

下面是片断:

wpsD5D1.tmp

3.4装饰者模型的应用:JAVA I/O

wps1966.tmp

下图是JAVA  I/O的类图架构:

wps86F8.tmp

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息