《Effective C++》条款35

考虑virtual函数以外的其他选择

1.Non-Virtual Interface

class A
{
public:
	void test()
	{
        // 做一些事前工作
		dotest();
        // 做一些事后工作
	}
private:
	virtual void dotest()
	{
		cout << "A";
	}
};
class B :public A
{
public:
	void test()
	{
		dotest();
	}
private:
	virtual void dotest()
	{
		cout << "B";
	}
};

这个public non-virtual成员函数称为virtual函数的外覆器

这种手法称为NVI手法,在调用Virtual函数前做一些事前工作,包括锁定互斥器,制造运转日志记录项,验证class约束条件,验证函数先决条件等。事后工作包括互斥器的解除锁定,验证函数的事后条件,再次验证class的约束条件等。

2.Function Pointers

class A;
int defaultf(const A& a);
class A
{
public:
	typedef int (*funcptr)(const A& a);
	explicit A(funcptr hcf = defaultf)
		:func(hcf){}
	int value() const
	{
		return func(*this);
	}
private:
	funcptr func;
};

这样创建不同的对象就可以传入不同的函数,而且函数可以在运行期变更。假如A提供一个函数,用来替换当前的函数。

3.function 

class A;
int defaultf(const A& a);
class A
{
public:
	typedef function Func;
	explicit A(Func hcf = defaultf)
		:func(hcf){}
	int value() const
	{
		return func(*this);
	}
private:
	Func func;
};

相当于一个泛型指向函数的指针。有需要时也进行bind

古典 

class A;
class Func
{
public:
	virtual int cal(const A& a) const;
};
Func defaultCal;
class A
{
public:
	explicit A(Func* hcf = &defaultCal)
		:func(hcf){}
	int value() const
	{
		return func->cal(*this);
	}
private:
	Func* func;
};

Func类作为基类,多个函数可以继承Func类,构造A类对象时可以传入不同的函数类,A类便可以进行多态调用不同的函数。

总结: 

Strategy模式将算法独立于程序流程之外,降低了算法与程序主流程之间的耦合度。

你可能感兴趣的:(c++)