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

C++編程中使用設(shè)計(jì)模式中的policy策略模式的實(shí)例講解

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


   在看《C++設(shè)計(jì)新思維》的時(shí)候,發(fā)現(xiàn)在一開(kāi)始就大篇幅的介紹策略模式(policy),策略模式不屬于經(jīng)典設(shè)計(jì)模式中的一種,但是其實(shí)在我們?nèi)粘5拈_(kāi)發(fā)中是必不可少的。policy,策略,方針,這里的意思是指把復(fù)雜功能的類(lèi)盡量的拆分為功能單一的簡(jiǎn)單類(lèi)的組合,簡(jiǎn)單的類(lèi)只負(fù)責(zé)單純行為或結(jié)構(gòu)的某一方面。增加程序庫(kù)的彈性,可復(fù)用性,可擴(kuò)展性。policy是一個(gè)虛擬的概念,他定義了某一類(lèi)class的一些接口規(guī)范,并不與C++語(yǔ)法的關(guān)鍵字對(duì)應(yīng),只是一個(gè)抽象的概念。

實(shí)例1:

//policy模式的常見(jiàn)使用實(shí)例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_;
};

實(shí)例2,比如說(shuō):我們定義一個(gè)policy,他是一個(gè)帶有參數(shù)T的一個(gè)模版,他必須有一個(gè)Create函數(shù),且返回T類(lèi)型指針。對(duì)于這個(gè)定義,我們可以有不同的實(shí)現(xiàn),從而滿(mǎn)足不同用戶(hù)的不同的需求。

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)用方法二:因?yàn)橐话鉓anager是特定于某一類(lèi)的class,所以在Manager中就指定要處理的class類(lèi)型。
template <template <class Created> class CreationPolicy>
class WidgetManager : public CreationPolicy<Widget>
{  
};
void main()
{
  // Application code
typedef WidgetManager<OpNewCreator> MyWidgetMgr;
}

對(duì)于上面一個(gè)策略有3中不同的實(shí)現(xiàn),從而就可以滿(mǎn)足不同的客戶(hù)的需求。
但是對(duì)于上面的使用,我們還可以有更好的修改:因?yàn)镻olicy的實(shí)現(xiàn)class一般會(huì)被繼承,所以我們要考慮他的析構(gòu),一般的我們使析構(gòu)函數(shù)virtual,但是這里會(huì)影響template的靜態(tài)編譯特性,影響效率,所以我們使用protected或private的析構(gòu)函數(shù),既不影響繼承類(lèi)對(duì)基類(lèi)的析構(gòu),也不影響使用。
如修改如下:

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

我們還可以修改上面的manger,實(shí)現(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 模式對(duì)我們創(chuàng)建可復(fù)用,可擴(kuò)展的庫(kù)的開(kāi)發(fā)有非常重要的作用,是OO的基本的設(shè)原則式之一。

總的說(shuō)來(lái)策略模式:
優(yōu)點(diǎn):
1、 使用策略模式可以避免使用多重條件轉(zhuǎn)移語(yǔ)句。多重轉(zhuǎn)移語(yǔ)句不易維護(hù)。
2、 策略模式讓你可以動(dòng)態(tài)的改變對(duì)象的行為,動(dòng)態(tài)修改策略

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    用C語(yǔ)言畫(huà)一個(gè)圓

    大家好,本篇文章主要講的是用C語(yǔ)言畫(huà)一個(gè)圓,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽
    2022-01-01
  • CrashRpt使用案例詳解

    CrashRpt使用案例詳解

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

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

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

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

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

    基于C語(yǔ)言實(shí)現(xiàn)學(xué)生選課系統(tǒng)

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

    關(guān)于C語(yǔ)言位運(yùn)算的簡(jiǎn)單示例

    這篇文章主要介紹了關(guān)于C語(yǔ)言位運(yùn)算的簡(jiǎn)單示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評(píng)論

佛教| 安泽县| 芷江| 南雄市| 洛浦县| 余姚市| 兖州市| 长治市| 灵宝市| 南郑县| 锦州市| 永州市| 黄龙县| 综艺| 临沭县| 南川市| 通许县| 泸州市| 偏关县| 顺昌县| 甘南县| 龙口市| 迁安市| 家居| 米易县| 县级市| 泰州市| 乌拉特前旗| 迁安市| 弋阳县| 临安市| 巫溪县| 宜章县| 宜兴市| 奇台县| 金坛市| 卢氏县| 砚山县| 天门市| 泸水县| 遂昌县|