昨天学习了这个设计模式,也就是模板方法模式,它是类行为模式中的一个。
首先看一下这个模式的意图:
定义一个算法的股价,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重新定义该算法的某些步骤。
该模式的动机为:
通过使用抽象操作定义一个算法中的一些步骤,模板方法确定了它们的先后顺序但它允许子类改变某些操作的具体步骤以满足各自的需求。
该模式的适用性:
1.一次性实现算法的不变部分,并将可变的行为留给子类实现。
2.各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
3.控制子类扩展,模板方法只在特定点调用钩子操作,这样只允许在这些点进行扩展。
结构如下:(忘记一些UML的元素了,暂且这样表示吧)
其中Document类中实现了Application中的Step1和Step3操作,而整个算法的流程为Step1,Step2,Step3,Step4;Document类靠Application类实现不变的部分。
效果:
模板方法是一种代码复用的基本技术,它们在类库中显得尤为重要,提取了类库中的公共行为。模板方法导致了一种反向的控制结构,称为“好莱坞法则”即“别找我们,我们找你”。这里指的是基类调用子类的方法。模板方法调用下列操作:
具体的操作(Document类中的操作)
具体的操作(Application中不变的操作)
抽象操作(原语操作)
钩子操作,它提供了缺省行为,子类在必要时可以扩展,钩子操作默认下是空操作。
最重要的是弄明白什么是钩子操作,哪些是抽象的操作(必须重新定义)。
代码示例如下:
1 |
|
其中Step1,Step3就是钩子操作,而Application中的Step1和Step3什么也不做,其中的Step1和Step3不一定要重新被定义,所以不算是抽象操作。如果使用纯虚函数,那么Step1和Step3就会是抽象的操作。