设计模式-策略模式

策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

比如:超市会进行普通收费,打折,满减等活动,并且这些算法会经常变化。
UML:
这里写图片描述

与工厂模式不同之处在于:工厂与每个子类关联,并生成子类的实例。客户端需要知道这些具体的子类和工厂类。
而策略模式直接与抽象类关联,客户端通过固定的接口获得结果,只需要知道管理类即可。

//收费抽象类
class CashSuper {
public:
    virtual double acceptCash(double money) = 0;
};
//普通收费类
class CashNomal :public CashSuper {
public:
    double acceptCash(double money)
    {
        return money;
    }
};
//打折收费类
class CashReBate :public CashSuper {
private:
    double m_rebate;
public:
    CashReBate(double Rebate) :m_rebate(Rebate) {}
    double acceptCash(double money)
    {
        return money*m_rebate;
    }
};
//满减收费类
class CashReturn :public CashSuper {
private:
    double m_money;
    double m_return;
public:
    CashReturn(double Money, double Return) :m_money(Money), m_return(Return) {}
    double acceptCash(double money)
    {
        double res = money;
        if (money >= m_money)
            res = money - (money/m_money)*m_return;
        return res;
    }
};
enum TYPE { Nomal, Rebate, Return };
//收费管理类(一般使用简单工厂方法,将switch从客户端转移过来)
class CashContext {
private:
    CashSuper *cs;
public:
    CashContext(TYPE type)
    {
        switch (type)
        {
        case Nomal:
            cs = new CashNomal();
            break;
        case Rebate:
            cs = new CashReBate(0.8);
            break;
        case Return:
            cs = new CashReturn(300, 100);
            break;
        }
    }
    double GetResult(double money)
    {
        return cs->acceptCash(money);
    }
};

int main()
{
    CashContext *super1 = new CashContext(Nomal);
    cout << super1->GetResult(100) << endl;
    CashContext *super2 = new CashContext(Rebate);
    cout << super2->GetResult(100) << endl;
    CashContext *super3 = new CashContext(Return);
    cout << super3->GetResult(300) << endl;
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值