设计模式---策略模式 实例

策略模式将算法封装到一个类里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现
将算法的逻辑抽象接口封装到一个类中,再通过委托的方式将具体的算法实现委托给具体的策略类来实现。


代码实例:

#include <iostream>

using namespace std;


基类:

class cashSuper
{
    public:
        virtual double acceptCash(double money) = 0;
};


正常收费类:

class cashNormal : public cashSuper
{
    public:
        double acceptCash(double money)
        {
            return money;
        }
};


打折收费类:

class cashRebate : public cashSuper
{

    private:
        double rebate;
    public:
        cashRebate(double money_rebate)
        {
            rebate = money_rebate;
        }
            
        double acceptCash(double money)
        {
            /* double rebate;
            cout<<"please input rebate: ";
            cin>>rebate; */
            return money * rebate;
        }
};


返钱收费类:

class cashReturn : public cashSuper
{
    private:
        double moneyCondition;
        double moneyReturn;

    public:
        cashReturn(double Condition, double Return)
        {
            moneyCondition = Condition;
            moneyReturn = Return;
        }

        double acceptCash(double money)
        {
            double result;
            result = money - int(money/moneyCondition) * moneyReturn;
            return result;
        }
};


策略类:

class cashContext
{
    private:
        cashSuper *m_cs;
    public:
        cashContext(cashSuper *cs)
        {
            m_cs = cs;
        }
        ~cashContext()
        {
            delete m_cs;
        }

        double getResult(double money)
        {
            return m_cs->acceptCash(money);//一定记着不能用m_cs.acceptCash(money)
        }
};




int main()
{
//正常收费

    double money = 500;
/*
    cashContext cashContext(new cashNormal());    
    double normal = cashContext.getResult(money);
    cout<<"正常收费: \n"<<normal<<"\n";

    cashContext cashContext(new cashRebate(0.5));    
    double result = cashContext.getResult(money);
    cout<<"打折收费: \n"<<result<<"\n";
*/
    cashContext cashContext(new cashReturn(500, 30));    
    double result = cashContext.getResult(money);
    cout<<"返钱收费: \n"<<result<<"\n";
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值