上一篇小编叙述
模仿方法模式
模板方法模式----你该找对象了(一)
目录
1、概述
2、结构与分析
3、拓展
4、模式总结
3、拓展
钩子方法给子类留了“后门”可以通过在子类中实现的钩子方法对父类方法的执行进行约束,实现子类对父类行为的反向控制。(体现灵活性)
上篇博客续集,情侣之间约约会,看看电影,喝喝咖啡,调情调情还是不错的。说到喝咖啡,这不来到星巴克咖啡店
,我们要了一杯咖啡,当漂亮的服务员问你:“先生,您是否要加调料?”你是呆呆地站在那……还是站在那……还是站在那……
为了使用钩子,我们在子类中覆盖它,在这里,钩子控制了咖啡饮料是否执行某部分算法,说得更明确些,就是饮料中是否要加进调料。
先看类图:
说明:咖啡因饮料为抽象类,其中封装了一系列步骤方法,第一步:水煮沸(boilWater)、第二步:泡(brew)、第三步:放入杯子(pourInCup)、第四步:加调料(addCondiments),模板方法(prepareRecipe)中封装以上的步骤。
在类图中咱需要注意的是
钩子方法(customerWantsCondiments),在下面的代码中,钩子方法的返回值的类型是boolean型,默认返回值为true,在子类中可以根据实际情况覆盖该方法,其中用于具体子类Coffee
代码决定是否要实现父类的方法。
在具体子类CaffeeWithhook中
覆盖了钩子方法
customerWantsCondiments(),返回false,表示客户无需添加任何调料。如果顾客“想要”调料,返回ture时,此时我们才调用addCodiments()方法。
客户端代码如下:
4、模式总结
模板方法应用于下列情况:
? 1)
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
? 2)基于继承的代码复用技术
? 3)控制子类扩展(钩子方法)。
金无足赤,人无完人。模板模式固然很好,但也存在一些缺点:
每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,但是更加符合“单一职责原则”,使得类的内聚性得以提高。(桥接模式相结合使用)
版权声明:本文为博主原创文章,未经博主允许不得转载。