策略模式

90 阅读2分钟

策略模式

策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

Context(应用场景)

1、需要使用ConcreteStrategy提供的算法
2、内部维护一个Strategy的实例
3、负责动态设置运行时Strategy具体的实现算法
4、负责跟Startegy之间的交互和数据传递

Startegy(抽象策略类)

1、定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现

ConcreteStrategy(具体策略类)

1、实现了Strategy定义的接口,提供具体的算法实现

#include <iostream>
#include <cmath>
#include <string>
using namespace std;
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=="满1000送200")
        {
            cs=new CashReturn(1000,200);
        }
    }
    double getResult(double money)
    {
        return cs->acceptMoney(money);
    }
};
int main()
{
    double money=1000;
    CashContext *cc=new CashContext("正常收费");
    cout<<cc->getResult(money);
    return 0;
}

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

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

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