商业鬼才教你 策略模式

时间:2022-07-25
本文章向大家介绍商业鬼才教你 策略模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

文章目录

故事线

策略模式

故事线

一切准备妥当,广军的奶茶汉堡店“啃得起”准备开业大吉啦。

为了生意能够红火,广军挑选了学校地段,并准备开业大酬宾。

经过多方讨论,广军最终敲定了以下几套方案:

1、打九折
2、满30减5
3、满50减10
4、一杯奶茶一个汉堡送一根香肠

这小算盘打的,噼里啪啦响的,不愧是我们的商业鬼才 - 广军!

于是,广告一发,横幅一拉,喇叭一吹,开业大吉,生意红火,广军赚到了人气,学生们吃的也很开心。


策略模式

昨天讲完了工厂方法模式,是不是觉得这个地方可以套工厂方法进来,其实不然。

什么是策略模式 && 策略模式与工厂方法模式的区分

策略模式通过 定义一系列算法的方法,减少各种算法类与使用算法类之间的耦合。

工厂方法模式封装了很多个类,而策略模式封装的是算法,它俩类图也很像,不认真看还真的,安能辨我是哪个。。

策略模式类图:

工厂方法模式类图:

所以这里要先仔细区分一下二者:

  1. 用途不一样 工厂是创建型模式,它的作用就是创建对象; 策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为;
  2. 关注点不一样 一个关注对象创建 一个关注行为的封装
  3. 解决不同的问题 工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。 策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。

策略模式代码实现

#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训练营