白话总述
这个模式说要封装零散的算法,这样子类可以在任何时候让自己参与进计算当中去。
因为虽然很多类所表示的事物不同,但是它们所遵循的算法可能相同,那么就可以用同一个算法来产生出不同的事物。
这些算法应该被复用。
把这些公共的方法都放在基类中是理所当然的想法,但是茶就是茶,咖啡就是咖啡,两者毕竟不同。
为了最大化地把两者的共通点放在基类中,基类中某些方法必须是abstract的,两者的不同只能交由具体的茶或者咖啡来实现。
基类提供了模本,里面是最基本的算法,子类只需要实现部分方法即可使用。
Template Method Pattern defined
该模式定义了一个算法的框架,把部分具体的步骤交给子类来完成。它允许子类在不改变模板定义的情况下重新定义算法的某些步骤。
这个模式就是在创建模板。
模板类中还包含了一个具体的方法和一个hook方法。
这个具体的方法子类无法覆盖,它要么被模板本身使用,要么被子类直接使用。
默认情况下hook没有实现,子类可以重写hook。
这两个方法都非常有用。
Hooked on Template Method
hook就是钩子,它的作用很多,如果你想直接使用hook的默认方法,那就直接用。否则,你就写个方法来覆盖hook就好。
hook方法的方法名称不一定叫hook,hook说的是一类方法。
在该模式下子类必须实现抽象类中的所有抽象方法。
hook方法其实就是对处理一类事物的各个通用方法和步骤的组织,通俗点说就是,你要在这个方法中按部就班地去执行那些通用的步骤,而这些步骤早就是固定套路了。如果你别出心裁想不走寻常路,则可以重写hook方法。
The Hollywood Principle
别来找我,我来找你。
高层次组件可以调度低层次组件,反之则不行。
低层次组件是挂在高层次组件上面的,即,依赖于高层组件。
我们要避免循环依赖。
Template Method in the Wild
这种模式适合创建框架,
它和策略模式的区别
策略模式是对算法的完全封装,直接使用,而模版模式中的部分算法步骤需要子类来实现。
模版模式可以在不失共性的基础上给你添加个性的空间,而个性是通过HOOK实现的。
工厂方法是模版方法的一个特例,虽然这一点我还没体会到,但是以后会实践到。