设计模式---策略模式

93 阅读2分钟

策略模式的定义

策略模式是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。

代码示例

抽象策略类 CashSuper:定义了一个纯虚函数 acceptCash,这个函数是所有具体策略类必须实现的。

class CashSuper
{
public:
    virtual double acceptCash(double, int) = 0;
    virtual ~CashSuper() {}
};

具体策略类 CashNormal, CashRebate, CashReturn:分别实现了正常收费、打折收费和满减收费的算法。

class CashNormal : public CashSuper
{
public:
    double acceptCash(double price, int num) override
    {
        return price * num;
    }
};

class CashRebate : public CashSuper
{
public:
    double acceptCash(double price, int num) override
    {
        return price * num * m_rebate;
    }

    CashRebate(double rebate)
    {
        m_rebate = rebate;
    }
private:
    double m_rebate = 1;
};

class CashReturn : public CashSuper
{
public:
    CashReturn(double condition, double returnMoney)
    {
        m_condition = condition;
        m_returnMoney = returnMoney;
    }

    double acceptCash(double price, int num) override
    {
        double result = price * num;
        if (m_condition > 0 && result >= m_condition)
        {
            result = result - (int(result / m_condition)) * m_returnMoney;
        }
        return result;
    }

private:
    double m_condition = 0;
    double m_returnMoney = 0;
};

上下文类 CashContext:根据不同的收费类型初始化不同的收费策略,并通过调用策略对象的方法来执行具体的收费算法。

class CashContext
{
public:
    CashContext(int type)
    {
        switch (type)
        {
        case 1:
            cs = new CashNormal();
            break;
        case 2:
            cs = new CashRebate(0.8);
            break;
        case 3:
            cs = new CashRebate(0.7);
            break;
        case 4:
            cs = new CashReturn(300, 100);
            break;
        }
    }

    double getResult(double price, int num)
    {
        return cs->acceptCash(price, num);
    }

private:
    CashSuper* cs;
};

主函数 main:测试代码,创建一个具体策略对象,通过上下文类调用具体策略的方法。

int main()
{
    CashContext* cc = new CashContext(4);
    double result = cc->getResult(84.8, 35);

    std::cout << "收费金额:" << result << std::endl;

    delete cc;

    return 0;
}

总结

通过使用策略模式,可以在运行时选择不同的算法,从而使代码更加灵活和可扩展。添加新的收费策略时,只需实现一个新的具体策略类,并在上下文类中进行相应的修改,而不需要改变现有的客户代码。