产生类的思路方法:策略(Policy)

基于策略类设计(Policy)

设计类准则就是要进行复用但是面向对象却把类作为最小单位这样造成复用困难或者根本无法复用请看下面例子:
A
{
public:
void kao { }
};

B
{
public:
void kao { }
void dao { }
};

如果我要写个C他需要Akao实现和Bdao实现那么我们就陷入个困难情景难道我们从A和B继承?这将把A和B其他不相关东西都通通弄进来不然我们只要拷贝代码?这是完全不对只有种解法就是把这个提出来作为个模板象这样:

template< T>
void kao(T* p) { }

template< T>
void dao(T* p) { }

但是我们发现如果kao和dao需要访问T私有成员时候我们又遇到困难而且我们并没有直观指出:kao和dao是AB部分这将造成规则(也就是要求我们记忆东西)

我们希望在我们实现AB时候就明确自己在干什么也明确AB里到底有什么所以我们用下面思路方法:

K
{
public:
void kao { }
};

D
{
public:
void dao { }
};


A : public K { };

B : public D
{
public:
void kao { }
};

C : public K, public D { };

我们称KD为策略类有策略组成这些策略就是方面

当然找到完全正交策略是非常好就象上面B他同时使用了kaodao这个时候如果K和D是互不相关那么很好但是事情却经常不是这样如果我们有个精灵类他包括动画管理和图形显示而我们可以有好几种动画管理策略和图形显示策略这个时候我们就可以任意组合但是动画策略很可能需要画图这个时候我们动画策略和显示策略是分开所以动画策略看不到显示策略提供这个时候般需要使用接口但是这个会生成大量接口你需要为你每个功能实现接口但是我们提供了种不正交策略实现思路方法基础是模板提前扫描迭代编译迟后联接

请看:

template< T>
K
{
public:
void kao { _<T*>(this)->dao; }
};

template< T>
D
{
public:
void dao { _cat<T*>(this)->kao; }
};

template< template<> T1, template<> T2>
B_Impl : public T1<B_Impl>, public T2<B_Impl> { };

typedef B_Impl<K, D> B;

为了方便我实现下面策略

template< T>
Relex
{
private:
Relex(const Relex&);
Relex& operator = (const Relex&);
public:
typedef T _HostType;
typedef T& _HostReference;
typedef T* _HostPoer;
public:
Relex { }
T* GetHostPtr { reerpret_cast<T*>(this); }
};

则上面KD 可以改写为:

template< T>
K : private Relex<T>
{
public:
void kao { GetHostPtr->dao; }
};

template< T>
D : private Relex<T>
{
public:
void dao { GetHostPtr->kao; }
};

组合实现是非常重要复用机制他是将来编程发展方向随着编译器标准化使用模板已不再是障碍
Tags: 

延伸阅读

最新评论

发表评论