《9》模版方法模式

来源:互联网 发布:对软件验收标准 编辑:程序博客网 时间:2024/06/07 06:59

设计原则7(好莱坞原则):

别调用(打电话给)我们,我们会调用(打电话给)你



理解:

允许底层组件挂钩到高层,但由高层组建决定什么时候和怎样使用底层组件;

区别与”依赖倒置原则“,依赖倒置强调的是不依赖具体类;

而本规则中,是在已经依赖一个具体类的基础上了,父类调用子类完成功能的同时,子类又调用父类实现自己的功能;



下面来看看依赖这个规则的模版方法设计模式;



先看问题:

我们要自己动手制作咖啡因饮料,现有品种是Coffee&Tea两类,我们需要完成以下步

骤,才能完成制作



好了,现在轮到我们设计啦







上设计图(山寨版):




上代码(钢筋混凝土):


方法模版类:

public abstract class CaffeeineBeverage {//方法骨架要设计成final 防止被修改final void prepareBeverage(){boilWater();brew();pourInCup();addCondiments();}//算法骨架里的固有步骤,设置成peivate|final,保护起来    private void pourInCup() {    System.out.println("pourInCup");}private void boilWater() {System.out.println("boilWater");}//这里是需要子类重新定义的步骤,写成abstract,”提醒“子类实现abstract void brew();abstract void addCondiments();}

负责步骤重定义的子类:

public class Tea extends CaffeeineBeverage{@Overridevoid brew() {System.out.println("使用沸水泡茶");}@Overridevoid addCondiments() {System.out.println("往茶中加入柠檬");}}


直接给出模版方法定义:

在一个方法中定义一个算法骨架,而将一些步骤的实现延迟到子类,模版方法可以使子类在不修改算法结构的情况下,重新定义算法的某些步骤


理解:

算法骨架是不能动的,”某些“改成”全部“这个骨架子类不就可以完全掌控了,此时方法模版类也就失去了作用;

注意到上面的实现代码其实有讲到三个部分:骨架主体固有步骤重定义步骤,其实还有一个钩子




钩子:

可以修改上面的工程代码如下:

//方法骨架要设计成final 防止被修改final void prepareBeverage(){boilWater();brew();pourInCup();addCondiments();hook();}       void hook() {}


理解:

定义了一个子类可选择重写的空方法或者说默认方法,因为子类不重写即为默认,

1》它可以让子类实现算法中的可选部分

2》可以让子类可以控制 方法模版对即将发生的事情 做出 符合子类身份的反应


对于第二点提供例子解释:

//方法骨架要设计成final 防止被修改final void prepareBeverage(){boilWater();brew();pourInCup();if(hook()){addCondiments();}}       boolean hook() {return true;}


这样子类就可以通过hook()来控制方法模版的行为,

比如:我是”白水“子类,不需要加入调料,这不符合我的身份


注意”空方法“的理解,空实现或者默认的实现




拓展:

注意和策略模式的区别。策略模式是一个完整的方法实现,而方法模版则是步骤由子类组合而来;

这里为什么说组合而不是”继承“,因为我们的例子用的就是继承啊,我想说将子类(这里不应该说子类,我们要将继承关系拿掉)抽象成另一个新的接口,让模版方法类对接口编程,

然后调用传入子类的brew&addCondiments方法,来完成模版方法,也是模版方法模式


再来看看和策略模式的区别。策略模式是全权委托,我们这是部分调用主逻辑还在我们这,

怎么用我们说了算



0 0
原创粉丝点击