Posted on 2009-02-11 01:46
Fox 阅读(1947)
评论(2) 编辑 收藏 引用 所属分类:
T技术碎语
在一个稍微上规模(怎么也有几十个类吧)的C++程序中,继承和组合的使用比比皆是。虽然GoF提出了OOD的两个原则,第二个谓之『优先使用对象组合,而不是继承』,但这绝不意味着不使用继承,正因如此,第一个原则才是『针对接口编程,而不是针对实现编程』,这两个原则清楚的表达了软件工程中『低耦合』的思想。
模板方法(Template Method)的意图正是『定义一个操作中的算法的框架,而将一些步骤延迟到子类中』。
注意,这里有个关键词『一些』,既然是『一些』,就意味着父类的的接口中已经实现了『一些』步骤,否则,父类便只提供了抽象接口。
这一情况是我们在编码时时常遇到的,父类实现了部分算法中的通用行为,子类根据自己的需求可对其进行必要扩充。
class CBase
{
public:
// Default done
virtual void Operation(void)
{
...
}
};
class CDerive :
public CBase
{
public:
virtual void Operation(void)
{
switch( ... )
{
case A: ...
case B: ...
case c: ...
default:
CBase::Operation();
}
}
};
因为对父类的不了解或是对子类的太了解,你以为CDerive::Operation()
做了足够多,不需要CBase::Operation()
,但实际上仍然需要的情况总在发生。
换一种方式,把Operation()
作为模板方法,把DoOperation()
作为可扩展的接口提供给子类实现:
class CBase
{
public:
void SetFocus(void) { ... }
void ResetFocus(void) { ... }
// Call by user
void Operation(void)
{
SetFocus();
DoOperation();
ResetFocus();
}
// Default done
virtual void DoOperation(void) = 0;
}; class CDerive :
public CBase
{
public:
virtual void DoOperation(void)
{
...
}
};
模板方法只是提供了一个简单的封装技巧,当然不是所有的虚接口都这么写:)。
更多内容请移步我的个人主页。