商业鬼才教你 策略模式

在这里插入图片描述

故事线

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

为了生意能够红火,广军挑选了学校地段,并准备开业大酬宾。
在这里插入图片描述

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

1、打九折
2、满305
3、满5010
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;
}

仔细比对工厂模式与策略模式,可以看出工厂模式暴露了过多的接口,但是拓展方面相较于策略模式更加的灵活,策略模式如果要进行拓展,不仅仅要对类进行拓展,还要对策略调控类打开修改,反正各有优劣啦。

策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的借口单独测试。就算某个算法出问题,也不会影响到其他的算法。


还行吧。

创作不易,顺手收藏好习惯,划着划着,就找不到了。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43762191/article/details/108628367
今日推荐