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