C++编程中使用设计模式中的policy策略模式的实例讲解

2020-01-06 14:41:57丽君
易采站长站为您分析C++编程中使用设计模式中的policy策略模式的实例讲解,文章最后对策略模式的优缺点有一个简单的总结,需要的朋友可以参考下  


   在看《C++设计新思维》的时候,发现在一开始就大篇幅的介绍策略模式(policy),策略模式不属于经典设计模式中的一种,但是其实在我们日常的开发中是必不可少的。policy,策略,方针,这里的意思是指把复杂功能的类尽量的拆分为功能单一的简单类的组合,简单的类只负责单纯行为或结构的某一方面。增加程序库的弹性,可复用性,可扩展性。policy是一个虚拟的概念,他定义了某一类class的一些接口规范,并不与C++语法的关键字对应,只是一个抽象的概念。

实例1:


//policy模式的常见使用实例smartptr,
template
<
  class T,
  template <class> class CheckingPolicy,
  template <class> class ThreadingModel
>
class SmartPtr
  : public CheckingPolicy<T>
  , public ThreadingModel<SmartPtr>
{  
  T* operator->()
  {
   typename ThreadingModel<SmartPtr>::Lock guard(*this);
   CheckingPolicy<T>::Check(pointee_);
   return pointee_;
  }
private:
  T* pointee_;
};

实例2,比如说:我们定义一个policy,他是一个带有参数T的一个模版,他必须有一个Create函数,且返回T类型指针。对于这个定义,我们可以有不同的实现,从而满足不同用户的不同的需求。


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_;
};

//test class
class Widget
{
};

//调用方法一:
template <class CreationPolicy>
class WidgetManager : public CreationPolicy
{  
};
void main()
{

typedef WidgetManager< OpNewCreator<Widget> > MyWidgetMgr;


}

//调用方法二:因为一般Manager是特定于某一类的class,所以在Manager中就指定要处理的class类型。
template <template <class Created> class CreationPolicy>
class WidgetManager : public CreationPolicy<Widget>
{  
};
void main()
{
  // Application code
typedef WidgetManager<OpNewCreator> MyWidgetMgr;
}

对于上面一个策略有3中不同的实现,从而就可以满足不同的客户的需求。