c 實現策略模式

2021-06-06 14:28:44 字數 1975 閱讀 1327

策略模式(strategy):它定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。

上面是《大話設計模式》中給出的定義,感覺這個概念給的不好,看了之後不能完全清晰明白該模式(可能自己水平太水的原因吧)。在《effective c++》中指出,策略模式是virtual 函式的替換方法。仔細想想也差不多。如果想在不同的類中實現不同的演算法,那麼在基類中定義乙個virtual函式,派生類給出不同的實現即可。這裡出現乙個問題,如果要實現的演算法太多(演算法引數、返回值等不同),那麼需要在基類中都進行virtual宣告,在具體的類中給出具體函式的實現。那麼每個派生類都需要繼承那麼多virtual 函式(而且多數沒用),派生類好臃腫啊。有人給出派生類**法,工廠模式,其實就是每個演算法給出乙個實現類外加多型的使用;別的方法,那就是每個演算法實現乙個類,把這個類傳入到具體的過程類中,讓演算法類作為過程類的乙個屬性,可以根據要求進行設定,當然這個演算法跟工廠模式有些相似處。(後面有兩者關係圖)

先描述一下應用場景吧,設計商場收費軟體,要求能夠滿足,不同的打折要求、不同的滿幾百送幾百的返利要求。比如:店慶打8折,國慶節滿300送100;

下面看一下,工廠模式和策略模式關係圖,看一下他們之間的差別:

工廠模式:

策略模式:

下面看一下傳統的策略模式的實現**:

#include#includeusing namespace std;

class cashsuper

;class cashnormal : public cashsuper

};class cashrebate : public cashsuper

double acceptcash(double money);

private:

double moneyrebate;

};double cashrebate::acceptcash(double money)

class cashreturn : public cashsuper

double acceptcash(double money);

private:

double moneycondition;

double moneyreturn;

};double cashreturn::acceptcash(double money)

class cashcontext

double getresult(double money);

private:

cashsuper *cs;

};double cashcontext::getresult(double money)

上面的是傳統策略模式的實現**,但是只是個框架,很好看,不中用;沒有具體環境執行。

下面是策略模式和工廠模式結合的**,情景如上所述:其中1代表:正常模式收費;     2代表:滿300送100;   3代表:打8折。

將上面的cashcontext替換成concretecashcontext就可以直接執行了。

class concretecashcontext

;double concretecashcontext::getresult(double money)

concretecashcontext::concretecashcontext(int type)

}int main(int argc, char **argv)

參考:1、《大話設計模式》

2、《effective c++》

策略模式 C 實現

include include include 問題 和工廠模式的本質區別?using namespace std abstract sort class strategy class class super sort virtual void sort int a,int l,int r conc...

C 策略模式實現

策略模式 它定義了演算法家族,分別封裝起來,讓它們之間可以相互替換,此模式讓演算法的變化,不會影響到使用的客戶。strategy.cpp 定義控制台應用程式的入口點。include stdafx.h includeusing namespace std class strategy class co...

C 策略模式實現

收銀時,無論是打折還是滿減和積分,其實內容都封裝一些具體的演算法實現,這些演算法本身都只是一些策略。在物件導向中,乙個 經常會做各種活動,由於簡單工廠模式中包含了所有的收費方式,經常殺熟客,每次如果重新建立收費方式,都需要重新部署,變得非常麻煩,這些演算法本身都只是一種策略,咱們就把策略的不同區別看...