策略模式定義:
定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。
策略模式包含如下角色:
Context:環境類
Strategy:抽象策略類
ConcreteStrategy: 具體策略類
UML類圖:
測試案例
[code]int main(){ //商品費用 double cost; //採取某種收費策略之後的費用 double result; //假如 cost = 1029.88; //聲明要使用的具體策略類 //這裡顯示出了策略類的缺點:用戶端必須知道有哪些具體封裝的演算法。如本例必須知道三種收費方式Normal、Return、Rebate。 StrategyCashSuper *Normal = new ConerectStrategyNormal(cost);//抽象策略類(基類)指標指向衍生類別->具體策略類(普通收費方式) StrategyCashSuper *Return = new ConerectStrategyReturn(cost); //滿300返100收費方式 StrategyCashSuper *Rebate = new ConerectStrategyRebate(cost); //打八折收費 //聲明環境類,具體調用的演算法,由它來維護 Context *c = new Context(); //設定使用的策略類 c->setStrategy(Normal);//設定為普通收費 //調用演算法 result = c->getChargeResult(); std::cout << "Accrued expenses: " << result << std::endl; c->setStrategy(Return);//設定為滿300返100收費方式 //調用演算法 result = c->getChargeResult(); std::cout << "Accrued expenses: " << result << std::endl; c->setStrategy(Rebate);//設定為打八折收費 //調用演算法 result = c->getChargeResult(); std::cout << "Accrued expenses: " << result << std::endl; return 0;}
標頭檔Strategy.h
[code]#ifndef _2STRATEGY_H_#define _2STRATEGY_H_//策略類,演算法基類class StrategyCashSuper{protected: //商品應付費用,定義為保護成員供子類繼承 double cost; public: //建構函式 StrategyCashSuper(double c):cost(c){} //收費結果演算法 virtual double ChargeResult();//本想定義為純虛函數,但不可以。因為虛基類本不能執行個體化};//正常收費演算法class ConerectStrategyNormal: public StrategyCashSuper{public: //建構函式 ConerectStrategyNormal(double c):StrategyCashSuper(c){} //根據本類的收費方式,重寫繼承的收費演算法 double ChargeResult()override;};//滿300返100收費演算法class ConerectStrategyReturn: public StrategyCashSuper{public: //建構函式 ConerectStrategyReturn(double c):StrategyCashSuper(c){} //重寫收費演算法 double ChargeResult()override; };//打八折收費演算法class ConerectStrategyRebate: public StrategyCashSuper{public: //建構函式 ConerectStrategyRebate(double c):StrategyCashSuper(c){} //重寫收費演算法 double ChargeResult()override; };//環境類,根據具體演算法,維護上下文使用的類class Context{private: //策略基類 StrategyCashSuper *SCS;public: //設定使用的策略 void setStrategy(StrategyCashSuper *s); //具體執行的演算法 double getChargeResult();};#endif
實現Strategy.cpp
[code]#include "2Strategy.h"//基類double StrategyCashSuper::ChargeResult(){ return 0;}//正常收費double ConerectStrategyNormal::ChargeResult(){ return cost;}//滿300返100收費演算法double ConerectStrategyReturn::ChargeResult(){ double res = cost; if(res >= 300) res = cost - 100; return res;}//打八折收費演算法double ConerectStrategyRebate::ChargeResult(){ return cost *0.8;}//設定使用的演算法void Context::setStrategy(StrategyCashSuper *s){ SCS = s;}//具體執行的演算法double Context::getChargeResult(){ return SCS->ChargeResult();}
總結:
策略模式讓演算法獨立於使用它的客戶而變化,也成為政策模式。策略模式是一種對象行為型模式。
策略模式包含3個角色:抽象策略類為所支援的演算法聲明了抽象方法,是所有策略類的父類;具體策略類實現了在抽象策略類中定義的演算法。環境類在解決某個問題時可以採用多種策略類(缺點是用戶端需要知道所有封裝的策略類),在環境類中維護一個對抽象策略類的引用執行個體。
策略模式是對演算法的封裝,它把演算法的責任和演算法本身分割開,委派給不同的對象管理。策略模式通常把一個系列的演算法封裝到一系列的策略類裡面,作為一個抽象策略類的子類。
策略模式主要優點在於對“開閉原則”的完美支援,在不修改原有系統的基礎上可以更換演算法或者增加新的演算法,它很好的管理演算法家族,提高了代碼的複用性,是一種替換繼承,避免多重條件轉移語句的實現方式;其缺點在於用戶端必須知道所有的策略類,並理解其區別,同時在一定程度上增加了系統中類的個數,可能會存在很多策略類。
策略模式適用情況包括:在一個系統裡面有許多類,它們之間的區別僅在於它們的行為,使用原則模式可以動態地讓一個對象在許多行為中選擇一種行為;一個系統需要動態地在幾種演算法中選擇一種;避免使用難以維護的多重條件選擇語句;希望在具體策略類中封裝演算法和與之相關的資料結構。
以上就是C++設計模式淺識策略模式的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!