文章目录
借由Non-Virtual Interface手法实现Template Method模式——200
一个思想流派主张:virtual函数应该几乎总是private。因此较好的设计是保留某些成员函数是public成员函数,但让它成为non-virtual,并调用一个private virtual函数进行实际工作:
class GameDCharacter{
public:
int healthValue() const
{
...
int retVal = doHealthValue();
...
return retVal;
}
...
private:
virtual int doHealthValue() const
{
... //缺省算法,计算健康指数
}
};
当然NVI手法在很多情况下并不必要。
借由Function Pointer实现Strategy模式——201
另一个更戏剧性的设计主张“任务健康指数的计算与人物类型无关”,这样的计算完全不需要“人物”这个成分。例如我们可能会要求每个人物的构造函数接受一个指针,指向一个健康计算函数,而我们可以调用该函数进行实际计算:
class GameCharacter; //前置声明
int defaultHealthCalc(const GameCharacter& gc);
class GameCharacter{
public:
typedef int(*HealthCalcFunc)(const GameCharacter&);
explicit GameCharacter(HealthCalcFunc hcf=defaultHealthCalc):healthFunc(hcf){}
int healthValue() const{return healthFunc(*this);}
...
private:
HealthCalcFunc healthFunc;
};
借由tr1::function完成Strategy模式——203
这节和上节必须要有strategy设计模式基础,不然看不懂。暂时搁置。
总结——207
(1)virtual函数的替代方案包括NVI手法及Strategy设计模式的多种形式。NVI手法自身是一个特殊形式的Template Method设计模式。
(2)将机能从成员函数移到class外部函数,带来的一个缺点是,非成员函数无法访问class的non-public成员。
(3)tr1::function对象的行为就像一般函数指针。这样的对象可接纳“与给定之目标签名式兼容”的所有可调用物。