故事线
一切准备妥当,广军的奶茶汉堡店“啃得起”准备开业大吉啦。
为了生意能够红火,广军挑选了学校地段,并准备开业大酬宾。
经过多方讨论,广军最终敲定了以下几套方案:
1、打九折
2、满30减5
3、满50减10
4、一杯奶茶一个汉堡送一根香肠
这小算盘打的,噼里啪啦响的,不愧是我们的商业鬼才 - 广军!
于是,广告一发,横幅一拉,喇叭一吹,开业大吉,生意红火,广军赚到了人气,学生们吃的也很开心。
策略模式
昨天讲完了工厂方法模式,是不是觉得这个地方可以套工厂方法进来,其实不然。
什么是策略模式 && 策略模式与工厂方法模式的区分
策略模式通过 定义一系列算法的方法,减少各种算法类与使用算法类之间的耦合。
工厂方法模式封装了很多个类,而策略模式封装的是算法,它俩类图也很像,不认真看还真的,安能辨我是哪个。。
策略模式类图:
工厂方法模式类图:
所以这里要先仔细区分一下二者:
-
用途不一样
工厂是创建型模式,它的作用就是创建对象;
策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为; -
关注点不一样
一个关注对象创建
一个关注行为的封装 -
解决不同的问题
工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。
策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。
策略模式代码实现
#include<iostream>
using namespace std;
//抽象基类
class cashbase
{
public:
virtual double accept_cash(double money) = 0;
};
//各个子类
class cashnormal: public cashbase //买汉堡加奶茶送香肠
{
public:
double accept_cash(double money) {
return money; } //原价返回
};
class cashrebate: public cashbase //打折
{
private:
double rebate;
public:
cashrebate(double rebate) {
this->rebate = rebate; }
double accept_cash(double money) {
return money * this->rebate; }
};
class cashreturn: public cashbase //满返
{
private:
double moneycondition = 0.0;
double moneyreturn = 0.0;
public:
cashreturn(double moneycondition, double moneyreturn)
{
this->moneycondition = moneycondition;
this->moneyreturn = moneyreturn;
}
double accept_cash(double money)
{
if (money >= this->moneycondition)
return (money - this->moneyreturn);
else
return money;
}
};
//早期模式工厂
//class cashcontex
//{
//private:
// cashbase *cb; //这不是类引用对象
//public:
// cashcontex(cashbase* cb) { this->cb = cb; }//将收费策略作为参数传入
// double getresult(double money) { return cb->accept_cash(money); }
//
//};
//由于会绕回工厂模式的老路,故取消这种做法
class cashcontex
{
private:
cashbase* cb = NULL;//这是指针对象
public:
cashcontex(int type, double rebate, double moneycondition, double moneyreturn)
{
if (type == 0)
{
cashnormal* cn = new cashnormal();
cb = cn;
}
else if (type == 1)
{
cashrebate* cr = new cashrebate(rebate);
cb = cr;
}
else if (type == 2)
{
cashreturn* crt = new cashreturn(moneycondition, moneyreturn);
cb = crt;
}
}
double getresult(double money){
return cb->accept_cash(money);}
};
int main()
{
cashcontex* cc = new cashcontex(1, 0.6, 0, 0);
double ret = cc->getresult(300.0);
cout << ret << endl;
return 0;
}
仔细比对工厂模式与策略模式,可以看出工厂模式暴露了过多的接口,但是拓展方面相较于策略模式更加的灵活,策略模式如果要进行拓展,不仅仅要对类进行拓展,还要对策略调控类打开修改,反正各有优劣啦。
策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的借口单独测试。就算某个算法出问题,也不会影响到其他的算法。
还行吧。
创作不易,顺手收藏好习惯,划着划着,就找不到了。
转载:https://blog.csdn.net/qq_43762191/article/details/108628367