C++ デザイン パターンにおける戦略パターンの簡単な紹介

黄舟
リリース: 2017-01-18 15:05:57
オリジナル
1124 人が閲覧しました

戦略パターン定義:

はアルゴリズムのファミリーを定義し、それらを個別にカプセル化して、相互に置き換えることができるようにします。このパターンにより、アルゴリズムの変更がアルゴリズムを使用する顧客に影響を与えなくなります。

戦略パターンには次の役割が含まれます:

Context: 環境クラス

Strategy: 抽象戦略クラス

ConcreteStrategy: 具体的な戦略クラス

UML クラス図:

C++ デザイン パターンにおける戦略パターンの簡単な紹介

テストケース

[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;
}
ログイン後にコピー

ヘッダファイル戦略.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 つの役割が含まれています。抽象戦略クラスは、サポートされているアルゴリズムの抽象メソッドを宣言し、すべての戦略クラスの親クラスです。具象戦略クラスは、抽象戦略クラスで定義されたアルゴリズムを実装します。環境クラスは、特定の問題を解決するために複数の戦略クラスを使用でき (欠点は、クライアントがカプセル化された戦略クラスをすべて知っている必要があることです)、環境クラス内の抽象戦略クラスへの参照インスタンスを維持します。

戦略パターンはアルゴリズムをカプセル化したもので、アルゴリズムの責任をアルゴリズム自体から分離し、別のオブジェクト管理に委任します。戦略パターンは通常、一連のアルゴリズムを抽象戦略クラスのサブクラスとして一連の戦略クラスにカプセル化します。

戦略モードの主な利点は、元のシステムを変更することなく、アルゴリズムを置き換えたり、新しいアルゴリズムを追加したりできることです。このコードは、継承を置き換え、複数の条件付き転送ステートメントを回避する実装メソッドです。その欠点は、クライアントがすべてのストラテジ クラスを理解し、それらの違いを理解する必要があることです。同時に、システム内のクラスの数が増加します。ある程度、戦略クラスがたくさんあるかもしれません。

戦略パターンが適用される状況は次のとおりです。システムには多数のクラスがあり、それらの違いはその動作のみです。戦略パターンを使用すると、システムが動的に必要とする動作のうち 1 つをオブジェクトに選択させることができます。いくつかのアルゴリズムの中から 1 つを選択します。維持が難しい複数の条件付き選択ステートメントの使用は避け、アルゴリズムとそれに関連するデータ構造を特定の戦略クラスにカプセル化します。

上記は C++ 設計パターンの戦略パターンの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) をご覧ください。


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート