Charpter02 策略模式

一、策略模式简介

策略模式是把算法和内容相分离,针对不同的策略实现不同的函数,用于处理内容中的数据,减少了算法类和使用算法类之间的耦合,并且由于算法的实现被单独的抽离出来,所以对不同算法的实现进行单元测试时也会更加的方便。

策略模式也可以与简单工厂模式相结合,在服务端内部是利用策略模式进行解耦合,在服务器与客户端之间是利用简单工厂模式进行解耦合。

策略模式就是用来封装算法的,在实践中,我们发现可以用它封装几乎任何类型的规则,只要在分析过程中听到需要在不同的时间应用不同的业务,则就可以考虑使用策略模式来处理这种变化的可能。

策略模式中,具体选择执行哪条实现,需要客户端指定,并转交给策略模式的context对象。

二、UML类图

 Charpter02 策略模式

 

 三、C++代码实现

 Charpter02 策略模式

// 策略基类
#ifndef _CASHSUPER_HPP
#define _CASHSUPER_HPP

class CashSuper{
    public:
    virtual double acceptCash(double money) = 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;
}

 

上一篇:Android_8使用adb的monkey对软件进行压力测试


下一篇:Android 系統自動化Monkey測試