C++設計模式淺識策略模式

來源:互聯網
上載者:User
策略模式定義:

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

策略模式包含如下角色:

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)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.