条款35:考虑virtual函数以外的其他选择

/**Non-Virtual Interface 手法实现Template Method模式
//一个有趣的流派主张:virtual函数几乎总是private, 用一个public non-virtual函数调用private(/protected) virtual函数来进行实际工作
//这是Template Method模式的一个独特的表现
//示例:
class GameCharacter
{
public:
int healthValue()
{
//...做一些事前工作
int retVal = doHealthValue();
//...做一些事后工作
return retVal;
}
private :
virtual int doHealthValue() const
{
//缺省算法,计算健康值
}
};
//优点就是可以在取得值之前和之后做一些公共的行为操作
****************************************************/


/**Function Pointer实现Strategy模式
#include <functional>
class GameCharacter;
int defaultHealthCalc(const GameCharacter& gc);
class GameCharacter
{
public:
typedef std::tr1::function<int (const GameCharacter&)> HealthCalcFunc;
explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)
: healthFunc(hcf)
{}
int healthValue() const
{return healthFunc(*this);}
private:
HealthCalcFunc healthFunc;
};


//tr1::function相当于一个指向函数的泛化指针,可以指代函数指针,函数对象,甚至其它对象的成员函数
//示例:
short calcHealth(const GameCharacter &); //函数,注意返回值是short
struct HealthCalculator //函数对象
{
int operator()(const GameCharacter&) const{}
};
class GameLevel //成员函数
{
public:
float health(const GameCharacter&) const;
};


class EvilBadGuy : public GameCharacter
{
public:
EvilBadGuy(HealthCalcFunc hcf = defaultHealthCalc)
: GameCharacter(hcf)
{}
};
class EyeCandyCharactor : public GameCharacter
{
public:
EyeCandyCharactor(HealthCalcFunc hcf = defaultHealthCalc)
: GameCharacter(hcf)
{}
};


EvilBadGuy ebg1(calcHealth);
EyeCandyCharactor ecc1(HealthCalculator());


GameLevel currentLevel;
EvilBadGuy ebg2(std::tr1::bind(&GameLevel::health, currentLevel, std::tr1::placeholders::_1));
****************************************************/


//1、使用non-virtual interface(NVI)手法,那是template method模式的一种特殊形式。它以public non-virtual成员函数包裹private/protected virtual函数
//2、将virtual替换成“函数指针成员变量”, 这是strategy模式的一种分解表现形式
//3、以tr1::function成员变量替换virtual函数,因而允许使用任何可调用物(callable entity)搭配一个兼容于需求的签名式。这也是strategy模式的某种形式
//4、将继承体系内的virtual函数替换为另一个继承体系里的virtual函数。这是strategy模式的传统手法。

猜你喜欢

转载自blog.csdn.net/u010731020/article/details/81035659