Charpter02戦略パターン

I.はじめにStrategyパターン

戦略は、アルゴリズムとクラスベースのアルゴリズムの使用との間の結合を低減する、コンテンツのためのデータ処理を異なる機能のための異なるポリシーを実装する、相分離法のモード及びコンテンツであり、別々のアルゴリズムが引っ張られているのでアウト、異なるアルゴリズムをテストユニットを実装するために、より便利になります。

戦略モードでは、単純な工場モード、簡単な工場モードのデカップリングを使用して、サーバーとクライアント間のデカップリング政策モードを使用して内部サーバと組み合わせることができます。

戦略モードはアルゴリズムをカプセル化するために使用され、実際には、我々はルールをパッケージのほぼすべてのタイプを見つけるためにそれを使用することができ、彼らがビジネスアプリケーションの異なる時間に異なるニーズの分析中聞くたび、あなたは戦略パターンを使用することを検討することができますこのプロセスは変更されることがあります。

戦略モード、実装の実現の特定の選択は、指定したクライアントを必要とし、戦略パターンのコンテキストオブジェクトに転送されます。

二、UML类图

 

 

 三、達成するためのC ++コード

 

// 戦略の基本クラス
_CASHSUPER_HPP #ifndefの
 に#define _CASHSUPER_HPP

クラスCashSuper {
     パブリック仮想 ダブル acceptCash(ダブルお金)= 0 ;
}。

#endifの
// 戦略1、提供していません
#ifndefの_CASHNORMAL_HPP
 の#define _CASHNORMAL_HPP

#include " cashsuper.hpp "

class CashNormal:public CashSuper{

    public:
    virtual double acceptCash(double monkey) override {
        return monkey;
    }

};
#endif
// 策略2 打八折
#ifndef _CASHREBATE_HPP
#define _CASHREBATE_HPP

#include"cashsuper.hpp"

class CashRebate:public CashSuper{

    public:
    virtual double acceptCash(double monkey) override {
        return monkey * discount / 10;
    }

    private:
    double discount = 8; 
};
#endif
// 策略3.满200减100
#ifndef _CASHRETURN_HPP 
#define _CASHRETURN_HPP

#include"cashsuper.hpp"

class CashReturn:public CashSuper{

    public:
    virtual double acceptCash(double monkey) override {
        if( monkey > monkeyCondition){
            return monkey - monkeyReduction;
        }
        else{
            return monkey;
        }
    }

    private:
    double monkeyCondition = 200;
    double monkeyReduction = 100;

};

#endif
// 上下文类 包含策略方法及简单工厂模式
#ifndef _CASHCONTEXT_HPP
#define _CASHCONTEXT_HPP

#include<string>
#include"cashsuper.hpp"
#include"cashreturn.hpp"
#include"cashnormal.hpp"
#include"cashrebate.hpp"
using namespace std;

class CashContext{

    public:
    CashContext(string type){
        if(type == "无优惠"){
            cs = new CashNormal();
        }
        else if(type == "打八折"){
            cs = new CashRebate();
        }
        else if(type == "满200减100") {
            cs = new CashReturn();
        }
        else{
            cs = nullptr;
        }
    }

    ~CashContext(){
        if(cs){
            delete cs;
            cs = nullptr;
        }
    } 

    double getResult(double monkey){
        if(!cs){
           return monkey; 
        }
        return cs->acceptCash(monkey);
    }
    
    private:
    CashSuper* cs;
    string type;

};
#endif
// 客户端测试代码
#include<iostream>
#include<string>
#include"cashcontext.hpp"
#include"cashsuper.hpp"

using namespace std;
int main(){
    double monkey = 300;
    double result; 

    string option[3]{"无优惠", "打八折", "满200减100"};
    CashContext cs(option[0]);
    result = cs.getResult(monkey);
    cout << result<<endl; 

    CashContext cs1(option[1]);
    result = cs1.getResult(monkey);
    cout << result<<endl;


    CashContext cs2(option[2]);
    result = cs2.getResult(monkey);
    cout << result<<endl;

    getchar();
    return 0;
}

 

おすすめ

転載: www.cnblogs.com/yb-blogs/p/12382228.html