日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

设计模式C++实现 —— 策略模式

發布時間:2023/12/10 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式C++实现 —— 策略模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

策略模式是指定義一系列的算法,把它們一個個封裝起來,并且使它們可相互替換。本模式使得算法可獨立于使用它的客戶而變化。也就是說這些算法所完成的功能一樣,對外的接口一樣,只是各自實現上存在差異。用策略模式來封裝算法,效果比較好。下面以高速緩存(Cache)的替換算法為例,實現策略模式。

?? ? ? 什么是Cache的替換算法呢?簡單解釋一下, 當發生Cache缺失時,Cache控制器必須選擇Cache中的一行,并用欲獲得的數據來替換它。所采用的選擇策略就是Cache的替換算法。下面給出相應的UML圖。


?? ? ??ReplaceAlgorithm是一個抽象類,定義了算法的接口,有三個類繼承自這個抽象類,也就是具體的算法實現。Cache類中需要使用替換算法,因此維護了一個 ?ReplaceAlgorithm的對象。這個UML圖的結構就是策略模式的典型結構。下面根據UML圖,給出相應的實現。

?? ? ? 首先給出替換算法的定義。

[cpp]?view plaincopyprint?
  • //抽象接口??
  • class?ReplaceAlgorithm??
  • {??
  • public:??
  • ????virtual?void?Replace()?=?0;??
  • };??
  • //三種具體的替換算法??
  • class?LRU_ReplaceAlgorithm?:?public?ReplaceAlgorithm??
  • {??
  • public:??
  • ????void?Replace()?{?cout<<"Least?Recently?Used?replace?algorithm"<<endl;?}??
  • };??
  • ??
  • class?FIFO_ReplaceAlgorithm?:?public?ReplaceAlgorithm??
  • {??
  • public:??
  • ????void?Replace()?{?cout<<"First?in?First?out?replace?algorithm"<<endl;?}??
  • };??
  • class?Random_ReplaceAlgorithm:?public?ReplaceAlgorithm??
  • {??
  • public:??
  • ????void?Replace()?{?cout<<"Random?replace?algorithm"<<endl;?}??
  • };??
  • ?? ? ? ? 接著給出Cache的定義,這里很關鍵,Cache的實現方式直接影響了客戶的使用方式,其關鍵在于如何指定替換算法。

    ?? ? ? ? 方式一:直接通過參數指定,傳入一個特定算法的指針。

    [cpp]?view plaincopyprint?
  • //Cache需要用到替換算法??
  • class?Cache??
  • {??
  • private:??
  • ????ReplaceAlgorithm?*m_ra;??
  • public:??
  • ????Cache(ReplaceAlgorithm?*ra)?{?m_ra?=?ra;?}??
  • ????~Cache()?{?delete?m_ra;?}??
  • ????void?Replace()?{?m_ra->Replace();?}??
  • };??
  • ?? ? ? ? ?如果用這種方式,客戶就需要知道這些算法的具體定義。只能以下面這種方式使用,可以看到暴露了太多的細節。

    [cpp]?view plaincopyprint?
  • int?main()??
  • {??
  • ????Cache?cache(new?LRU_ReplaceAlgorithm());?//暴露了算法的定義??
  • ????cache.Replace();??
  • ????return?0;??
  • }??
  • ?? ? ? ? ?方式二:也是直接通過參數指定,只不過不是傳入指針,而是一個標簽。這樣客戶只要知道算法的相應標簽即可,而不需要知道算法的具體定義。

    [cpp]?view plaincopyprint?
  • //Cache需要用到替換算法??
  • enum?RA?{LRU,?FIFO,?RANDOM};?//標簽??
  • class?Cache??
  • {??
  • private:??
  • ????ReplaceAlgorithm?*m_ra;??
  • public:??
  • ????Cache(enum?RA?ra)???
  • ????{???
  • ????????if(ra?==?LRU)??
  • ????????????m_ra?=?new?LRU_ReplaceAlgorithm();??
  • ????????else?if(ra?==?FIFO)??
  • ????????????m_ra?=?new?FIFO_ReplaceAlgorithm();??
  • ????????else?if(ra?==?RANDOM)??
  • ????????????m_ra?=?new?Random_ReplaceAlgorithm();??
  • ????????else???
  • ????????????m_ra?=?NULL;??
  • ????}??
  • ????~Cache()?{?delete?m_ra;?}??
  • ????void?Replace()?{?m_ra->Replace();?}??
  • };??
  • ?? ? ? ? ?相比方式一,這種方式用起來方便多了。其實這種方式將簡單工廠模式與策略模式結合在一起,算法的定義使用了策略模式,而Cache的定義其實使用了簡單工廠模式。

    [cpp]?view plaincopyprint?
  • int?main()??
  • {??
  • ????Cache?cache(LRU);?//指定標簽即可??
  • ????cache.Replace();??
  • ????return?0;??
  • }??
  • ?? ? ? ? ?上面兩種方式,構造函數都需要形參。構造函數是否可以不用參數呢?下面給出第三種實現方式。

    ?? ? ? ? ?方式三:利用模板實現。算法通過模板的實參指定。當然了,還是使用了參數,只不過不是構造函數的參數。在策略模式中,參數的傳遞難以避免,客戶必須指定某種算法。

    [cpp]?view plaincopyprint?
  • //Cache需要用到替換算法??
  • template?<class?RA>??
  • class?Cache??
  • {??
  • private:??
  • ????RA?m_ra;??
  • public:??
  • ????Cache()?{?}??
  • ????~Cache()?{?}??
  • ????void?Replace()?{?m_ra.Replace();?}??
  • };??
  • ?? ? ? ? ? 使用方式如下:

    [cpp]?view plaincopyprint?
  • int?main()??
  • {??
  • ????Cache<Random_ReplaceAlgorithm>?cache;?//模板實參??
  • ????cache.Replace();??
  • ????return?0;??
  • }??
  • ?? ? ? ?? 本人享有博客文章的版權,轉載請標明出處?http://blog.csdn.net/wuzhekai1985

    總結

    以上是生活随笔為你收集整理的设计模式C++实现 —— 策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。