策略模式定義:
定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。
策略模式包含以下角色:
Context:環境類別
Strategy:抽象策略類別
ConcreteStrategy: 具體策略類別
UMLg
[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; }
[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
策略模式讓演算法獨立於使用它的客戶而變化,也成為政策模式。策略模式是一種物件行為型模式。
策略模式包含3個角色:抽象策略類別為所支援的演算法聲明了抽象方法,是所有策略類別的父類別;具體策略類別實作了在抽象策略類別中定義的演算法。環境類別在解決某個問題時可以採用多種策略類別(缺點是客戶端需要知道所有封裝的策略類別),在環境類別中維護一個對抽象策略類別的參考實例。
策略模式是對演算法的封裝,它把演算法的責任和演算法本身分割開,委派給不同的物件管理。策略模式通常會把一個系列的演算法封裝到一系列的策略類別裡面,當作一個抽象策略類別的子類別。
策略模式主要優點在於對「開閉原則」的完美支持,在不修改原有系統的基礎上可以更換演算法或增加新的演算法,它很好的管理演算法家族,提高了程式碼的複用性,是一種替換繼承,避免多重條件轉移語句的實現方式;其缺點在於客戶端必須知道所有的策略類,並理解其區別,同時在一定程度上增加了系統中類的個數,可能會存在很多策略類。
策略模式適用情況包括:在一個系統裡面有許多類,它們之間的區別僅在於它們的行為,使用策略模式可以動態地讓一個物件在許多行為中選擇一種行為;一個系統需要動態地在幾種演算法中選擇一種;避免使用難以維護的多重條件選擇語句;希望在具體策略類別中封裝演算法和與之相關的資料結構。
以上就是C++設計模式淺識策略模式的內容,更多相關內容請關注PHP中文網(www.php.cn)!