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

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

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

策略模式也是一種非常常用的設(shè)計(jì)模式,而且也不復(fù)雜。下面我們就來(lái)看看這種模式。
定義:策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來(lái),而且使它們還可以相互替換。策略模式讓算法獨(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,需要在不同情況下使用不同的策略(算法),或者策略還可能在未來(lái)用其它方式來(lái)實(shí)現(xiàn)。
3,對(duì)客戶隱藏具體策略(算法)的實(shí)現(xiàn)細(xì)節(jié),彼此完全獨(dú)立。

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

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

相關(guān)文章

  • C++實(shí)現(xiàn)拼圖游戲代碼(graphics圖形庫(kù))

    C++實(shí)現(xiàn)拼圖游戲代碼(graphics圖形庫(kù))

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)拼圖游戲代碼,帶有g(shù)raphics圖形庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C++ 如何實(shí)現(xiàn)多線程與線程同步

    C++ 如何實(shí)現(xiàn)多線程與線程同步

    多線程中的線程同步可以使用,CreateThread,CreateMutex 互斥鎖實(shí)現(xiàn)線程同步,通過臨界區(qū)實(shí)現(xiàn)線程同步,Semaphore 基于信號(hào)實(shí)現(xiàn)線程同步,CreateEvent 事件對(duì)象的同步,以及線程函數(shù)傳遞單一參數(shù)與多個(gè)參數(shù)的實(shí)現(xiàn)方式。
    2021-06-06
  • C語(yǔ)言課程設(shè)計(jì)之抽獎(jiǎng)系統(tǒng)

    C語(yǔ)言課程設(shè)計(jì)之抽獎(jiǎng)系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言課程設(shè)計(jì)之抽獎(jiǎng)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C/C++ 函數(shù)原理傳參示例詳解

    C/C++ 函數(shù)原理傳參示例詳解

    這篇文章主要為大家介紹了C/C++ 函數(shù)原理傳參示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 基于C++實(shí)現(xiàn)的哈夫曼編碼解碼操作示例

    基于C++實(shí)現(xiàn)的哈夫曼編碼解碼操作示例

    這篇文章主要介紹了基于C++實(shí)現(xiàn)的哈夫曼編碼解碼操作,結(jié)合實(shí)例形式分析了C++實(shí)現(xiàn)的哈夫曼編碼解碼相關(guān)定義與使用技巧,需要的朋友可以參考下
    2018-04-04
  • QT中大部分部件如何使用舉例詳解

    QT中大部分部件如何使用舉例詳解

    QWidget類是所有用戶界面對(duì)象的基類,被稱為基礎(chǔ)窗口部件,下面這篇文章主要給大家介紹了關(guān)于QT中大部分部件如何使用的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • 基于C語(yǔ)言string函數(shù)的詳解

    基于C語(yǔ)言string函數(shù)的詳解

    本篇文章是對(duì)C語(yǔ)言中string函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++用boost.signal實(shí)現(xiàn)多播委托

    C++用boost.signal實(shí)現(xiàn)多播委托

    這篇文章介紹了C++用boost.signal實(shí)現(xiàn)多播委托的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C++分析類的對(duì)象作類成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員

    C++分析類的對(duì)象作類成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員

    終于到了對(duì)象的初始化和清理的最后階段了,在這里分享一個(gè)cpp里有多個(gè)類時(shí),一個(gè)類的對(duì)象作為另一個(gè)類成員的時(shí)候構(gòu)造函數(shù)和析構(gòu)函數(shù)調(diào)用的時(shí)機(jī)。還有一個(gè)靜態(tài)成員也是經(jīng)??嫉降狞c(diǎn),在這篇博客將會(huì)詳解其概念并舉出案例鞏固,讓我們開始
    2022-05-05
  • C語(yǔ)言 makefile學(xué)習(xí)及實(shí)現(xiàn)實(shí)例

    C語(yǔ)言 makefile學(xué)習(xí)及實(shí)現(xiàn)實(shí)例

    這篇文章主要介紹了C語(yǔ)言 makefile學(xué)習(xí)及實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評(píng)論