设计模式——策略模式


一、基本知识

1.定义

定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客户程序而变化。

2.要点

①策略模式提供了一系列可重用的算法,从而可以使得类型在运⾏时方便地根据需要在各个算法之间进行切换。
②策略模式消除了条件判断语句;也就是在解耦合。

二、结构图

在这里插入图片描述

三、实例说明

实例:某商场节假日有固定促销活动,为了加大促销力度,现提升国庆节促销活动规格。

1.普通代码

enum VacationEnum {
    VAC_Spring,
    VAC_QiXi,
    VAC_Wuyi,
    VAC_GuoQing,
    //VAC_ShengDan,
};

class Promotion {
    VacationEnum vac;
public:
    double CalcPromotion() {
        if (vac == VAC_Spring) {
            // 春节
        }
        else if (vac == VAC_QiXi) {
            // 七夕
        }
        else if (vac == VAC_Wuyi) {
            // 五一
        }
        else if (vac == VAC_GuoQing) {
            // 国庆
        }
    }

};

上面代码将所有节日都放到一个类里面,当一个节日的促销方案发生变化的话我们不得不修改类中的代码。由于所有节日都放到一个类里面,耦合度太高。

2.策略模式代码

//可以是促销的一些参数,也可以是其他的数据结构,主要看需要给节日穿什么参数
class Context {
};

class ProStategy {
public:
    virtual double CalcPro(const Context& ctx) = 0;
    virtual ~ProStategy();
};
// cpp
class VAC_Spring : public ProStategy {
public:
    virtual double CalcPro(const Context& ctx) {}
};
// cpp
class VAC_QiXi : public ProStategy {
public:
    virtual double CalcPro(const Context& ctx) {}
};
class VAC_QiXi1 : public VAC_QiXi {
public:
    virtual double CalcPro(const Context& ctx) {}
};
// cpp
class VAC_Wuyi : public ProStategy {
public:
    virtual double CalcPro(const Context& ctx) {}
};
// cpp
class VAC_GuoQing : public ProStategy {
public:
    virtual double CalcPro(const Context& ctx) {}
};

class VAC_Shengdan : public ProStategy {
public:
    virtual double CalcPro(const Context& ctx) {}
};

// 节日是稳定的  节日的促销策略是变化的
class Promotion {
public:
    Promotion(ProStategy* sss) : s(sss) {}
    ~Promotion() {}
    double CalcPromotion(const Context& ctx) {
        return s->CalcPro(ctx);
    }
private:
    ProStategy* s;
};

int main() {
    Context ctx;
    ProStategy* s = new VAC_QiXi1();
    Promotion* p = new Promotion(s);
    p->CalcPromotion(ctx);//就等同于直接 s->Calcpro();
    return 0;
}

这里把节日都分离开了。其实个人感觉每个设计模式之间都有或多或少其他设计模式的影子。因为设计模式的目标是一致的,就是尽可能满足设计模式(面向对象的)七大原则。只不过对于不同的类型的问题来说,尽可能满足这些要求而所需要的框架不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

孟小胖_H

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

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

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

打赏作者

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

抵扣说明:

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

余额充值