《Modern C++ Design》Policies 和Policy Classes

policy

所谓policy,其实就是一个类或者类模板的接口,它由内部类型定义(inner type definition),成员函数,成员变量组成。

它类似于设计模式中的Strategy.

这里先介绍一下Strategy:

结构
意图 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
适用性
  • 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
  • 需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时[ H O 8 7 ] ,可以使用策略模式。
  • 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
  • 一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的S t r a t e g y 类中以代替这些条件语句。

 

下面举个例子,定义一个policy来生成实体:Creatorpolicy是个带有类型T的类模板,它提供一个Create的接口函数,此函数不接受参数,返回一个指向T的指针。每当Create被调用就返回一个指针。

下面是三个具体的实体。

template <class T>
struct OpNewCreator
{
      static T* Create()
     {
           return new T;
      }
};


template <class T>
struct MallocCreator
{
      static T* Create()
     {
            void* buf = std::malloc(sizeof(T));
            if (!buf) return 0;
            return new(buf) T;
      }
};


template <class T>
struct PrototypeCreator
{
       PrototypeCreator(T* pObj = 0): pPrototype_(pObj){}
       T* Create()
       {
              return pPrototype_ ? pPrototype_->Clone() : 0;
       }
       T* GetPrototype() { return pPrototype_; }
        void SetPrototype(T* pObj) { pPrototype_ = pObj; }
private:
        T* pPrototype_;
};

这三个具体的实体就叫做policy classes或许有点不恰当,因为他们也带有模板。

 

policies接口和普通的类接口的区别在于它比较松散,没有类接口那样严格的限制,比如Create函数,我可以不必是virtual的,也可以不返回指针T,只需要必须定义Create就可以了。

前三个实例它们全都定义Create()並帶有必要的返回类型,所以它们都符合Creator policy。

 

现在设计一个使用Creatorpolicy的类,它用继承或复合的方式使用前面的第一个实例。

template <class CreationPolicy>
class WidgetManager : public CreationPolicy
{ ... };

 

如果这个类使用了一个或多个policies,我们称其为host或host classes,WidgetManager便是采用一个policies的host class. host 负责把polices提供的结构和行为组合成一个更复杂的结构和行为

 

当客户端将WidgetManager template具体化时,必须传进一个它所期望的policy
typedef WidgetManager< OpNewCreator<Widget> > MyWidgetMgr;

当MyWidgetMgr实体需要产生一个Widget实体时,它便调用它的policy子实体OpNewCreator<Widget>所提供的Create().选择生成策略(Create policy)是WidgetManage使用者自由。通过这样的设计,WidgetManager使用者便可自动装配他所要的功能。

 

《Modern C++ Design》Policies 和Policy Classes

你可能感兴趣的:(《Modern C++ Design》Policies 和Policy Classes)