Item 22. 模板方法与曲线救国(Template Method)

王朝other·作者佚名  2006-01-09
宽屏版  字体: |||超大  

Item 22. Template Method

敬告

Template Method 与 C++中的templates毫不相干,它只是一种设计方法(亦或设计模式)。

------------------------

1、Template Method设计的目的

Template Method是用于基类设计的一种方法,它使得子类的任务更加清晰,让子类设计者的注意力集中于基类的contract是如何实现的,而不必关心各个contract之间的关系。对于基类来说就是“曲线救国”。

2、从继承角度看成员函数

虚函数,纯虚函数,非虚函数

对虚函数函数,子类设计者有权利选择是否Overriding它。因此基类设计者就需要对它有一个默认的实现。

对纯虚函数,子类就必须要Overriding它。

而非虚函数,子类可以写一个与基类有的一样的非虚函数(not called Overriding),但子类里的这个函数又不能用于多态机制,所以还是不要写它。

3、从访问权利看成员函数

private,public,protected

……

4、Template Method 的实现

Template Method 就是依靠2、3两点来实现的。

基类用一个public nonvirtual 成员函数访问protected virtual成员函数,

子类在需要的时候可以选择Overriding那个protected virtual成员函数,如果是个

pure protected virtual成员函数,那就必须Overriding它。

class App {

public:

virtual ~App();

//...

void startup() { // Template Method

initialize();

if( !validate() )

altInit();

}

protected:

virtual bool validate() const = 0;

virtual void altInit();

//...

private:

void initialize();

//...

};

class MyApp : public App {

public:

//...

private:

bool validate() const;

void altInit();

//...

};

5、为什么要用Template Method?

Template Method使得基类控制了函数的调用顺序(执行流程),子类只负责某个步骤的实现(具体要看是虚还是纯虚)。这样在子类不知道执行细节的情况下,整个系统就动起来了。确实很妙!MFC就是这样的。

所以就不要奇怪当年有人选择“曲线救国”那条路了

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有