模板方法带来的一些好处:
上图中的几个好处持怀疑态度。首先代码复用是最无所谓的一件事,我到目前认为纯粹为了复用而使用模板方法是一件很愚蠢的事。
这个模板方法的一个麻烦之处在于,如果茶和咖啡在boilWater()或pourInCup()两个方法上出现了分歧,即代码不再一模一样,那么茶和咖啡就需要重新在子类各自实现自己的方法。
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
问题:为什么“算法的结构”就必须不变呢?什么情况下,让“算法的结构”不变会省大事?
模板方法模式类图:
一个模板抽象类的示例代码:
其中最后一个方法 hook() 是一个 钩子。
钩子用法1:钩子控制是否执行某部分算法。
钩子函数作为控制条件,影响抽象类中的算法流程。
钩子的另一个用法是让子类能够有机会对模板方法中某些即将发生的(或刚刚发生的)步骤做出反应。(没懂)
好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你。
就是说底层组件绝对不要直接调用高层组件,只让高层依赖底层,不要双向依赖。
注:这里的高层似乎指的是抽象层次的高层。
注:由第二个问答可以看出,就算是底层组件在自己的实现里调用了从高层组件继承而来的方法,也算是底层在依赖高层组件!(想想这样应该确实算是依赖)
模板方法实例:Java数组类的排序
又一个例子:JFrame中的“钩子”:
paint()方法作为JFrame类中的一个钩子方法,它可以让子类自行选择是否要在paint()中进行绘图操作,让绘图操作变成了一个子类可选择的选项。
再一个例子:Applet中的钩子: