2.策略模式

1策略模式的核心内容是:

A:包含策略的抽象类

B:不同的策略分别实现

C:策略控制器,通过这个策略控制器实现调度控制策略。

2策略模式的作用是根据传递进去的参数不同,实现调度执行不同的策略。

3策略模式具体描述

策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,

 

从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下

 

发生变化。策略模把行为和环境分开。环境类负责维持和查询行为类,

 

各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,

修改都不会影响到环境和客户端。

 

跟不同类型的MM约会,要用不同的策略,有的请电影比较好,

有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到MM的芳心,

我的追MM锦囊中有好多Strategy哦。

 

策略的抽象类,接口,抽象类的指针可以访问所有子类对象,(纯虚函数)

实现的各种策略,各种策略的实现类,都必须继承抽象类

策略的设置接口类,设置不同策略

4.策略模式类图

5.代码:

#include<iostream>

#include<cmath>

#include <string>

using namespace std;

//策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,

 

//从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下

 

//发生变化。策略模把行为和环境分开。环境类负责维持和查询行为类,

 

//各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,

//修改都不会影响到环境和客户端。

//

//跟不同类型的MM约会,要用不同的策略,有的请电影比较好,

//有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到MM的芳心,

//我的追MM锦囊中有好多Strategy哦。

 

//策略的抽象类,接口,抽象类的指针可以访问所有子类对象,(纯虚函数)

//实现的各种策略,各种策略的实现类,都必须继承抽象类

//策略的设置接口类,设置不同策略

 

//收钱的抽象类,也就是策略的抽象类

class CashSuper

{

public:

    //收钱的纯虚函数

    virtual double acceptMoney(double money) = 0;

};

 

//正常收钱的策略

class CashNormal :public CashSuper

{

public:

    //正常收钱

    double acceptMoney(double money)

    {

        return money;

    }

};

 

//打折的策略

class CashRebate :public CashSuper

{

private:

    double discount;

public:

    //折扣

    CashRebate(double dis)

    {

        discount = dis;

    }

    //收钱

    double acceptMoney(double money)

    {

        //折扣

        return money*discount;

    }

};

 

//返现的策略

class CashReturn :public CashSuper

{

private:

    double moneyCondition;

    double moneyReturn;

public:

    //花多少钱,返回多少钱

    CashReturn(double mc, double mr)

    {

        moneyCondition = mc;

        moneyReturn = mr;

    }

    //收钱,返款

    double acceptMoney(double money)

    {

        double result = money;

        if (money >= moneyCondition)

        {

            result = money - floor(money / moneyCondition)*moneyReturn;

        }

        return result;

    }

};

 

//策略的控制类

class  CashContext

{

private:

    CashSuper *cs;

public:

    CashContext(string str)//设置策略

    {

        if (str == "正常收费")

        {

            cs = new CashNormal();

        }

        else if (str == "9")

        {

            cs = new CashRebate(0.9);

        }

        else if (str == "1000200")

        {

            cs = new CashReturn(1000, 200);

        }

    }

    double getResult(double money)

    {

        return cs->acceptMoney(money);

    }

};

 

int main()

{

    double money = 1000;

    //可以改变下面括号中的值,如果是下面的的一句,运行结果是800

    //CashContext *cc = new CashContext("1000200");

    //若是下面这句,显示的是1000

    //CashContext *cc = new CashContext("正常收费");

    //下面的这句的意思是打九折,运行结果是:900

    CashContext *cc = new CashContext("9");

   

    cout << cc->getResult(money);

    cin.get();

    return 0;

}

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涂作权的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值