ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Charpter02 策略模式

2020-02-29 20:54:40  阅读:218  来源: 互联网

标签:hpp monkey double HPP 模式 cs include Charpter02 策略


一、策略模式简介

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

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

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

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

二、UML类图

 

 

 三、C++代码实现

 

// 策略基类
#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;
}

 

标签:hpp,monkey,double,HPP,模式,cs,include,Charpter02,策略
来源: https://www.cnblogs.com/yb-blogs/p/12382228.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有