项目需求
有一家咖啡店, 供应咖啡和茶, 它们的工序如下:
咖啡:
茶:
可以看到咖啡和茶的制作工序是差不多的, 都是有4步, 其中有两步它们两个是一样的, 另外两步虽然具体内容不一样, 但是都做做的同一类工作...算法分布在了不同的类里面
使用模板方法后:
CaffeineBeverage这个父类控制并保护算法
父类最大化的代码的复用
算法只在一个地方, 改变算法也只需改变这个地方
新的饮料只需实现部分工序即可...模板方法里面的钩子
所谓的钩子, 它是一个在抽象类里面声明的方法, 但是方法里面默认的实现是空的. 这也就给了子类"钩进"算法某个点的能力, 当然子类也可以不这么做, 就看子类是否需要了....DIP告诉我们不要使用具体的类, 尽量使用抽象类. 而好莱坞原则则是让低级别组件可以被钩进算法中去, 也没有建立低级别组件和高级别组件间的依赖关系....三种模式比较:
模板方法模式: 子类决定如何实现算法中特定的步骤
策略模式: 封装变化的行为并使用委托来决定哪个行为被使用.
工厂方法模式: 子类决定实例化哪个具体的类.