最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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


   在看《C++設計新思維》的時候,發(fā)現(xiàn)在一開始就大篇幅的介紹策略模式(policy),策略模式不屬于經(jīng)典設計模式中的一種,但是其實在我們?nèi)粘5拈_發(fā)中是必不可少的。policy,策略,方針,這里的意思是指把復雜功能的類盡量的拆分為功能單一的簡單類的組合,簡單的類只負責單純行為或結(jié)構的某一方面。增加程序庫的彈性,可復用性,可擴展性。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
{
};

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

typedef WidgetManager< OpNewCreator<Widget> > MyWidgetMgr;


}

//調(diào)用方法二:因為一般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、 使用策略模式可以避免使用多重條件轉(zhuǎn)移語句。多重轉(zhuǎn)移語句不易維護。
2、 策略模式讓你可以動態(tài)的改變對象的行為,動態(tài)修改策略

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

相關文章

  • C語言獲取Linux系統(tǒng)精確時間的方法

    C語言獲取Linux系統(tǒng)精確時間的方法

    下面小編就為大家?guī)硪黄狢語言獲取Linux系統(tǒng)精確時間的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • C++圖像處理之雙邊濾波

    C++圖像處理之雙邊濾波

    這篇文章主要為大家詳細介紹了C++圖像處理之雙邊濾波,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C語言?程序的編譯系統(tǒng)解析

    C語言?程序的編譯系統(tǒng)解析

    編譯程序的基本功能是把源程序(高級語言)翻譯成目標程序。但是,作為一個具有實際應用價值的編譯系統(tǒng),除了基本功能之外,還應具備語法檢查、調(diào)試措施、修改手段、覆蓋處理、目標程序優(yōu)化、不同語言合用以及人-機聯(lián)系等重要功能
    2022-02-02
  • Qt利用ffmpeg實現(xiàn)音視頻同步

    Qt利用ffmpeg實現(xiàn)音視頻同步

    這篇文章主要為大家詳細介紹了Qt如何利用ffmpeg實現(xiàn)音視頻同步的功能,文中的示例代碼講解詳細,對大家深入了解Qt有一定的幫助,需要的可以參考一下
    2023-01-01
  • 用C語言畫一個圓

    用C語言畫一個圓

    大家好,本篇文章主要講的是用C語言畫一個圓,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • CrashRpt使用案例詳解

    CrashRpt使用案例詳解

    這篇文章主要介紹了CrashRpt使用案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C/C++使用Zlib實現(xiàn)文件的壓縮與解壓

    C/C++使用Zlib實現(xiàn)文件的壓縮與解壓

    zlib 是一個開源的數(shù)據(jù)壓縮庫,旨在提供高效、輕量級的壓縮和解壓縮算法,本文將介紹如何使用 zlib 庫進行數(shù)據(jù)的壓縮和解壓縮,以及如何保存和讀取壓縮后的文件,感興趣的可以了解下
    2023-11-11
  • C語言程序環(huán)境和預處理詳解分析

    C語言程序環(huán)境和預處理詳解分析

    大家有沒有想過,在vs2019的編譯器上只要按下Ctrl+F5,一個test.c的源程序就能變成一個.exe的可執(zhí)行程序,這其中是如何通過編譯產(chǎn)生的呢,本章就和大家一起把其中的知識和重點的預處理一起學習一下
    2022-03-03
  • 基于C語言實現(xiàn)學生選課系統(tǒng)

    基于C語言實現(xiàn)學生選課系統(tǒng)

    這篇文章主要為大家詳細介紹了基于C語言實現(xiàn)學生選課系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 關于C語言位運算的簡單示例

    關于C語言位運算的簡單示例

    這篇文章主要介紹了關于C語言位運算的簡單示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12

最新評論

兴安县| 临澧县| 乡宁县| 昌平区| 盐源县| 湖北省| 礼泉县| 桦川县| 茂名市| 盐津县| 焉耆| 吉木乃县| 新密市| 于都县| 北票市| 准格尔旗| 瑞安市| 交城县| 和田市| 滕州市| 吉水县| 奉贤区| 南投市| 灵川县| 犍为县| 辛集市| 宜城市| 乌苏市| 望奎县| 鄂州市| 独山县| 民县| 北碚区| 临潭县| 南康市| 武宁县| 门头沟区| 龙海市| 嵩明县| 潜江市| 商水县|