商业鬼才教你 策略模式
时间:2022-07-25
本文章向大家介绍商业鬼才教你 策略模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
文章目录
故事线
策略模式
故事线
一切准备妥当,广军的奶茶汉堡店“啃得起”准备开业大吉啦。
为了生意能够红火,广军挑选了学校地段,并准备开业大酬宾。
经过多方讨论,广军最终敲定了以下几套方案:
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;
}
仔细比对工厂模式与策略模式,可以看出工厂模式暴露了过多的接口,但是拓展方面相较于策略模式更加的灵活,策略模式如果要进行拓展,不仅仅要对类进行拓展,还要对策略调控类打开修改,反正各有优劣啦。
策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的借口单独测试。就算某个算法出问题,也不会影响到其他的算法。
还行吧。
创作不易,顺手收藏好习惯,划着划着,就找不到了。
技术101训练营
- 分布式和集群区别?什么是云计算平台?分布式的应用场景?
- 中国移动也要搞自动驾驶,没了SIM卡怎么耍花样?
- python并发编程之多进程理论部分
- 使用concurrent.futures模块并发,实现进程池、线程池
- 人工智能与医疗
- 每周论文清单:知识图谱,文本匹配,图像翻译,视频对象分割
- 进程池、线程池、回调函数
- java学习:weblogic下JNDI及JDBC连接测试(weblogic环境)
- 简单谈谈python的反射机制
- java学习:使用dom4j读写xml文件
- python文件和目录操作方法大全
- 自动驾驶汽车伦理大讨论:到底谁有权决定他人的生死?
- 异常处理:1215 - Cannot add foreign key constraint
- pymysql模块
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- codeforces 1133D(map+精度控制)
- 1024程序员节 | 我在腾讯自研数据库,我为技术代言
- jasmine spyOn的单步调试
- codeforces 1363C(优先队列)
- 系统与应用异常定位诊断
- SQL优化终于干掉了“distinct”
- SAP Spartacus delivery mode页面Cannot find control with的错误消息
- codeforces 1349A(数学)
- 阔别两年,webpack 5 正式发布了!
- SAP Spartacus delivery mode continue button enable与否的逻辑
- codeforces 1342C(前缀和)
- leetcode-寻找两个正序数组的中位数
- Shell脚本常用命令一览
- 深入学习 React 合成事件
- 关于fixture.debugElement.query(By.css)这个方法的一个疑问