设计模式:装饰

2020-04-10  本文已影响0人  小追兵

给爱用继承的人一个全新的眼界

装饰者的定义

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

设计模式的原则:

这里说下“开闭原则”,意思是 对扩展开放,对修改关闭。现在我们有一个写好的功能实现,但是面对需求的改动,我们需要扩展几个功能,可是原来好不容易写好的代码,已经修复全部bug,调整到性能最优,如果被改动会带来很大风险。破坏原来的稳定性。那么怎么才能尽量对扩展开放,对修改关闭呢?来看看装饰着模式吧:

现在咱们用《Head First》中的星巴克咖啡的例子说下装饰模式。

抽象类 Beverage(饮料),那么店里的其他所有饮料要继承这个类;

现在有个场景,和饮料的人口味要求不同,有的要摩卡,优点要拿铁,有的要加奶,优点要加糖,不同要求,价格不同,这种组合的结果就太多了。因为假如不同口味,价格不同,那么,我们需要实现多少个Beverage的子类,重新多少个cost()方法,才能枚举所有的类型。这个维护成本就很大了。

上装饰者模式:

现在我们用饮料作为主体,我们在运行时以“糖”、“奶”等调料来“装饰”(decorate)饮料。
现在我需求是想要一个摩卡,和奶泡深焙咖啡。那么:

1、拿一个深焙咖啡(DarkRoast)对象
2、以摩卡(Mocha)对象装饰它
3、以奶泡(Whip)对象装饰它
4、调用cost()方法,并依赖委托(delegate) 将调料的价钱加上去

这里Whip装饰者,它也反映了DarkRoast类型,并包含一个cost()方法。

所以,被MochaWhip包起来的DarkRoast对象仍然是一个Beverage,仍然具有DarkRoast的一切行为,包括它的cost()方法。

现在我们看下调用链条:
1、首先调用对是最外层对Whipcost()方法
2、Whip内部则调用对是Mochacost()方法
3、Mocha内部又调用对是DarkRoastcost()方法
4、DarkRoastcost()返回对是它自己的价钱 7元
5、MochaDarkRoast的7元的基础上,加上自己的2元,返回新的价格9元
6、WhipMocha返回的9元的基础上,加上自己的1元,返回新的10元的价钱

华丽的总结下:

举栗子:

敬请期待 ......

上一篇 下一篇

猜你喜欢

热点阅读