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

深入解析C++編程中對設(shè)計(jì)模式中的策略模式的運(yùn)用

 更新時(shí)間:2016年03月09日 10:52:40   作者:十八道胡同  
這篇文章主要介紹了C++編程中對設(shè)計(jì)模式中的策略模式的運(yùn)用,需要的朋友可以參考下

策略模式也是一種非常常用的設(shè)計(jì)模式,而且也不復(fù)雜。下面我們就來看看這種模式。
定義:策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。

角色:

  •     抽象策略角色(Strategy): 抽象策略類。
  •     具體策略角色(ConcreteStrategy):封裝了繼續(xù)相關(guān)的算法和行為。
  •     環(huán)境角色(Context):持有一個(gè)策略類的引用,最終給客戶端調(diào)用。

UML圖:

201639105036032.jpg (548×222)

例子:

#include <iostream> 
using namespace std; 
 
class WeaponBehavior 
{ 
public: 
  void virtual useWeapon() = 0; 
}; 
 
class AK47:public WeaponBehavior 
{ 
public: 
  void useWeapon() 
  { 
    cout << "Use AK47 to shoot!" << endl; 
  } 
}; 
 
class Knife:public WeaponBehavior 
{ 
public: 
  void useWeapon() 
  { 
    cout << "Use Knife to kill!" << endl; 
  } 
}; 
 
class Character 
{ 
public: 
  Character() 
  { 
    weapon = 0; 
  } 
  void setWeapon(WeaponBehavior *w) 
  { 
    this->weapon = w; 
  } 
  void virtual fight() = 0; 
protected: 
  WeaponBehavior *weapon; 
}; 
 
class King:public Character 
{ 
public: 
  void fight() 
  { 
    cout << "The king:" ; 
    if ( this->weapon == NULL) 
    { 
      cout << "You don't have a weapon! Please Set Weapon!" << endl; 
    } 
    else 
    {  
      weapon->useWeapon(); 
    } 
  } 
}; 
int main() 
{   
  WeaponBehavior *ak47 = new AK47(); 
  WeaponBehavior *knife = new Knife();    
 
  Character *kin = new King();    
 
  kin->fight();   
  cout << endl;  
 
  kin->setWeapon(ak47); 
  kin->fight(); 
  cout << endl; 
 
  kin->setWeapon(knife); 
  kin->fight(); 
 
  return 0; 
} 

適用性:
1,多個(gè)類只區(qū)別在表現(xiàn)行為不同,可以使用Strategy模式,在運(yùn)行時(shí)動(dòng)態(tài)選擇具體要執(zhí)行的行為。
2,需要在不同情況下使用不同的策略(算法),或者策略還可能在未來用其它方式來實(shí)現(xiàn)。
3,對客戶隱藏具體策略(算法)的實(shí)現(xiàn)細(xì)節(jié),彼此完全獨(dú)立。

優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
1,策略模式提供了管理相關(guān)的算法族的辦法。策略類的等級結(jié)構(gòu)定義了一個(gè)算法或行為族。恰當(dāng)使用繼承可以把公共的代碼移到父類里面,從而避免代碼重復(fù)。
2,使用策略模式可以避免使用多重條件(if-else)語句。多重條件語句不易維護(hù),它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統(tǒng)統(tǒng)列在一個(gè)多重條件語句里面,比使用繼承的辦法還要原始和落后。
缺點(diǎn):
1,客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時(shí)選擇恰當(dāng)?shù)乃惴?。換言之,策略模式只適用于客戶端知道算法或行為的情況。
2,由于策略模式把每個(gè)具體的策略實(shí)現(xiàn)都單獨(dú)封裝成為類,如果備選的策略很多的話,那么對象的數(shù)目就會很可觀。

和其他設(shè)計(jì)模式的區(qū)別:
1,與狀態(tài)模式
在解決的問題上,狀態(tài)模式是解決內(nèi)在狀態(tài)的改變,而策略模式是解決內(nèi)部算法的改變。在解決的方法上,狀態(tài)模式是自我控制狀態(tài)的改變,而策略模式是由外部制定使用使用啥策略。
2,簡單工廠模式
簡單工廠模式是創(chuàng)建型模式,關(guān)注對象的創(chuàng)建。策略模式是行為型模式,關(guān)注行為的封裝。簡單工廠模式是根據(jù)不同的條件返回一個(gè)適合的類給你使用,然后調(diào)用者使用工廠類返回的類去完成相應(yīng)的操作。而策略模式是必須首先創(chuàng)建一個(gè)想使用的類實(shí)例,然后實(shí)例被當(dāng)作參數(shù)傳遞進(jìn)去,既而通過該實(shí)例去調(diào)用不用的算法。在簡單工廠模式中實(shí)現(xiàn)了通過條件選取一個(gè)類去實(shí)例化對象,策略模式則將選取相應(yīng)對象的工作交給模式的使用者,它本身不去做選取工作。

相關(guān)文章

  • C語言函數(shù)封裝及變量的作用域

    C語言函數(shù)封裝及變量的作用域

    這篇文章主要介紹了C語言函數(shù)封裝及變量的作用域,以及分享一些字符串的相關(guān)實(shí)戰(zhàn)練習(xí),字符串轉(zhuǎn)整數(shù)、整數(shù)轉(zhuǎn)字符串、浮點(diǎn)數(shù)轉(zhuǎn)字符串、字符串轉(zhuǎn)浮點(diǎn)數(shù)、判斷平年閏年、技術(shù)字符串長度等等。下文詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • 手把手帶你了解C++最小棧

    手把手帶你了解C++最小棧

    這篇文章主要介紹了C++的最小棧,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++實(shí)現(xiàn)LeetCode(173.二叉搜索樹迭代器)

    C++實(shí)現(xiàn)LeetCode(173.二叉搜索樹迭代器)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(173.二叉搜索樹迭代器),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言字符函數(shù)、內(nèi)存函數(shù)功能及實(shí)現(xiàn)代碼

    C語言字符函數(shù)、內(nèi)存函數(shù)功能及實(shí)現(xiàn)代碼

    這篇文章主要介紹了C語言字符函數(shù)、內(nèi)存函數(shù) 功能及實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • C++ CTreeview的checkbox使用方法

    C++ CTreeview的checkbox使用方法

    這篇文章主要介紹了C++ CTreeview的checkbox使用方法的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • C語言實(shí)現(xiàn)可排序通訊錄的示例代碼

    C語言實(shí)現(xiàn)可排序通訊錄的示例代碼

    本文主要介紹了C語言實(shí)現(xiàn)可排序通訊錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語言之地址傳遞和引用傳遞的問題

    C語言之地址傳遞和引用傳遞的問題

    這篇文章主要介紹了C語言之地址傳遞和引用傳遞的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • C++面向?qū)ο缶幊讨鰳?gòu)詳解

    C++面向?qū)ο缶幊讨鰳?gòu)詳解

    這篇文章主要為大家詳細(xì)介紹了C++面向?qū)ο缶幊讨鰳?gòu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Qt線程池QThreadPool的使用詳解

    Qt線程池QThreadPool的使用詳解

    本文主要介紹了Qt線程池QThreadPool的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 淺談C++11的std::mem_fn源碼解析

    淺談C++11的std::mem_fn源碼解析

    本文是基于gcc-4.9.0的源代碼進(jìn)行分析,std::mem_fn是C++11才加入標(biāo)準(zhǔn)的,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評論

周宁县| 祁连县| 开原市| 合作市| 米泉市| 新竹市| 饶河县| 东城区| 托克托县| 陈巴尔虎旗| 南昌市| 河北区| 和田市| 铜梁县| 内黄县| 乡宁县| 大连市| 宁国市| 清苑县| 冕宁县| 寻乌县| 宝坻区| 孟州市| 黄骅市| 岢岚县| 监利县| 巨鹿县| 华安县| 蓬莱市| 合肥市| 长春市| 凤翔县| 资阳市| 铁岭市| 和静县| 民乐县| 临泉县| 股票| 长宁区| 白山市| 郁南县|