欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++編程中使用設計模式中的policy策略模式的實例講解

 更新時間:2016年03月09日 11:06:38   作者:itech001  
這篇文章主要介紹了C++編程中使用設計模式中的policy策略模式的實例講解,文章最后對策略模式的優(yōu)缺點有一個簡單的總結,需要的朋友可以參考下


   在看《C++設計新思維》的時候,發(fā)現(xiàn)在一開始就大篇幅的介紹策略模式(policy),策略模式不屬于經典設計模式中的一種,但是其實在我們日常的開發(fā)中是必不可少的。policy,策略,方針,這里的意思是指把復雜功能的類盡量的拆分為功能單一的簡單類的組合,簡單的類只負責單純行為或結構的某一方面。增加程序庫的彈性,可復用性,可擴展性。policy是一個虛擬的概念,他定義了某一類class的一些接口規(guī)范,并不與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,他是一個帶有參數(shù)T的一個模版,他必須有一個Create函數(shù),且返回T類型指針。對于這個定義,我們可以有不同的實現(xiàn),從而滿足不同用戶的不同的需求。

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中不同的實現(xiàn),從而就可以滿足不同的客戶的需求。
但是對于上面的使用,我們還可以有更好的修改:因為Policy的實現(xiàn)class一般會被繼承,所以我們要考慮他的析構,一般的我們使析構函數(shù)virtual,但是這里會影響template的靜態(tài)編譯特性,影響效率,所以我們使用protected或private的析構函數(shù),既不影響繼承類對基類的析構,也不影響使用。
如修改如下:

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

我們還可以修改上面的manger,實現(xiàn)creator policy的switch:

template <template <class> class CreationPolicy>
class WidgetManager : public CreationPolicy<Widget>
{ 
  void SwitchPrototype(Widget* pNewPrototype)
  {
   CreationPolicy<Widget>& myPolicy = *this;
   delete myPolicy.GetPrototype();
   myPolicy.SetPrototype(pNewPrototype);
  }
};


policy 模式對我們創(chuàng)建可復用,可擴展的庫的開發(fā)有非常重要的作用,是OO的基本的設原則式之一。

總的說來策略模式:
優(yōu)點:
1、 使用策略模式可以避免使用多重條件轉移語句。多重轉移語句不易維護。
2、 策略模式讓你可以動態(tài)的改變對象的行為,動態(tài)修改策略

缺點:
1、客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。
2、類過多---策略模式造成很多的策略類,每個具體策略類都會產生一個新類。(這點可以通過享元模式來克服類過多)

相關文章

  • 解決 VSCode 編寫 C++11 代碼報紅問題分析

    解決 VSCode 編寫 C++11 代碼報紅問題分析

    今天在寫 C++ 代碼的時候用上 C++11 的特性,然后發(fā)現(xiàn) VSCode 雖然可以編譯通過,但是會在相應位置報紅,這是怎么回事呢?下面小編給大家?guī)砹私鉀Q方法,一起看看吧
    2021-09-09
  • C++、Qt分別讀寫xml文件的方法實例

    C++、Qt分別讀寫xml文件的方法實例

    Qt提供了QDomElement 類用于完成對xml文件的讀取和寫入,這篇文章主要給大家介紹了關于C++、Qt分別讀寫xml文件的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • MFC實現(xiàn)漂亮界面之美化按鈕

    MFC實現(xiàn)漂亮界面之美化按鈕

    這篇文章主要為大家詳細介紹了MFC實現(xiàn)漂亮界面之美化按鈕,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C語言中.與->的用法介紹

    C語言中.與->的用法介紹

    結構體用點,結構體指針用箭頭,簡單的說,就是一個快捷方式,一個語法糖,這篇文章主要介紹了C語言中.與->的區(qū)別及用法,需要的朋友可以參考下
    2023-05-05
  • C++實現(xiàn)棧的操作(push和pop)

    C++實現(xiàn)棧的操作(push和pop)

    這篇文章主要介紹了C++實現(xiàn)棧的操作(push和pop),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • opencv提取輪廓大于某個閾值的圖像

    opencv提取輪廓大于某個閾值的圖像

    這篇文章主要為大家詳細介紹了opencv提取輪廓大于某個閾值的圖像,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語言實現(xiàn)學生信息管理系統(tǒng)(文件操作)

    C語言實現(xiàn)學生信息管理系統(tǒng)(文件操作)

    這篇文章主要介紹了C語言實現(xiàn)學生信息管理系統(tǒng),增加了文件操作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++返回值是類名和返回值是引用的區(qū)別及說明

    C++返回值是類名和返回值是引用的區(qū)別及說明

    這篇文章主要介紹了C++返回值是類名和返回值是引用的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言讀寫配置文件的方法

    C語言讀寫配置文件的方法

    這篇文章主要介紹了C語言讀寫配置文件的方法,包括C語言讀寫ini配置文件所涉及的文件讀寫技巧,以及完整的源文件及頭文件實現(xiàn)方法,需要的朋友可以參考下
    2015-07-07
  • C語言創(chuàng)建數(shù)組實現(xiàn)函數(shù)init,empty,reverse

    C語言創(chuàng)建數(shù)組實現(xiàn)函數(shù)init,empty,reverse

    這篇文章主要介紹了C語言創(chuàng)建數(shù)組實現(xiàn)函數(shù)init,empty,reverse,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07

最新評論