模板方法(Template Method)-----类行为型模式

来源:互联网 发布:星图数据地址 编辑:程序博客网 时间:2024/06/11 18:45

模板方法(Template Method)-----类行为型模式 ( 学习笔记)

1.意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2.适用性
1)一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2)各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
3)控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展。(见本文附:hook简析)

3.结构

                     

4.参与者
*AbstractClass(抽象类)
---定义抽象的原语操作,具体的子类将重定义他们以实现一个算法的各步骤。
---实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作。
* ConcreteClass
---实现原语操作以完成算法中与特定子类相关的步骤。

5.协作
ConcreteClass靠AbstractClass来实现算法中不变的步骤。

6.效果
模板方法调用下列类型的操作:
*具体的操作(ConcreteClass或对客户类的操作)
*具体的AbstractCalss的操作。
*原语操作。(即抽象操作)
*Factory Method。
*钩子操作(hook operations),它提供了缺省的行为,子类可以在必要时进行扩展。一个钩子操作在缺省操作通常是一个空操作。
7.实现及代码示例:
1)注意问题:
* 使用C++访问控制 在C++中,一个模板方法调用的原语操作可以被定义为保护成员。这保证它只被模板方法调用。必须重定义的原语操作须定义为纯虚函数。模板方法自身不需被重定义;因此可以将模板方法定义为一个非虚成员函数。
*尽量减少原语操作
2)代码示例:
//以下为代码解析:
一个支持在屏幕上绘图的类View。一个视图在进入“焦点”(focus状态时才可设定合适的特定绘图状态(如颜色和字体),因而只有成为“焦点”之后才能进行绘图。View类强制其子类做到这一点。
用Display模板方法来解决这个问题。View定义两个具体操作。SetFocus 和ResetFocus,分别设定和清除绘图状态,View的DoDisplay钩子操作实现真正的绘图功能。Display在DoDisplay前调用SetFocus以设定绘图状态:Display在此后调用ResetFocus已释放绘图状态。

//以下是源码(示意)
class View {
public:
void Display();
void SetFocus();
virtual void DoDisplay();
void ResetFocus();
};

class MyView : public View {
public:
virtual void DoDisplay();
};
/*
*/
void View::Display () {
SetFocus();
DoDisplay();
ResetFocus();
}
/*
*/
void View::DoDisplay () { }
/*
*/
void MyView::DoDisplay () {
// render the view's contents
}
/*
*/

8.一点感想:
在mfc中用很多类似的类结构.
如CDialog的OnOK();



//附: 钩子简析:

原创粉丝点击