【设计模式】2.策略模式

UML

code

复制代码
#pragma once

#define DISCOUNT 0.5
class CashBase
{
public:
	virtual double getCash(double price, int num) = 0;
};

class CashNormal : public CashBase
{
public:
	double getCash(double price, int num) override
	{	
		return price * num;
	}
private:
};

class CashDiscount : public CashBase
{
public:
	CashDiscount(double discount)
	{
		this->discount = discount;
	}
	double getCash(double price, int num) override
	{
		return price * num * this->discount;
	}
private:
	double discount;
};

class CashReturn : public CashBase
{
public:
	CashReturn(double moneyCondition, double moneyReturn)
	{
		this->moneyCondition = moneyCondition;
		this->moneyReturn = moneyReturn;
	}
	double getCash(double price, int num) override
	{
		double res = price * num;
		if (moneyCondition > 0 && res >= moneyCondition)
		{
			res -= moneyReturn * (res / moneyCondition);
		}
		return res;
	}
private:
	double moneyCondition;
	double moneyReturn;
};

enum class CashType
{
	Normal,
	Discount,
	Return
};

// 策略类:包含一个基类的指针,构造函数中做策略的选择,选择合适的对象赋值给基类指针,然后提供一个上层调用接口,去调用子类的重写函数
// 工厂类:提供一个全局的接口,根据传入的参数,返回最终的对象实例
class CashContext
{
public:
	~CashContext() = default;
	// 通过构造函数,传入具体的收费策略
	CashContext(CashType type) : cashbase(nullptr)
	{
		switch (type)
		{
		case CashType::Normal:
			this->cashbase = new CashNormal();
			break;
		case CashType::Discount:
			this->cashbase = new CashDiscount(DISCOUNT);
			break;
		case CashType::Return:
			this->cashbase = new CashReturn(500, 100);
			break;
		default:
			break;
		}
	}
	double getCash(double price, int num)
	{
		return this->cashbase->getCash(price, num);
	}
private:
	CashBase* cashbase;
};```
相关推荐
浮游本尊22 分钟前
Java学习第15天 - 服务网关与API管理
java
熙客1 小时前
Java:LinkedList的使用
java·开发语言
blueblood1 小时前
🗄️ JFinal 项目在 IntelliJ IDEA 中的 Modules 配置指南
java·后端
●VON1 小时前
如何通过docker进行本地部署?
java·docker·容器
杨杨杨大侠2 小时前
第8篇:Spring Boot集成 - 开发自己的Starter
java·spring·开源
赵得C2 小时前
Java 多线程环境下的全局变量缓存实践指南
java·开发语言·后端·spring·缓存
Aeside12 小时前
漫谈代理模式,静态代理到 JDK 和 CGLIB 动态代理
java·设计模式
我梦见我梦见我2 小时前
一文看懂Spring MCP 的请求链路
java·mcp
waynaqua3 小时前
最强工具库 Hutool,使用教程(含 Hutool-AI 使用讲解)
java
渣哥3 小时前
很多人分不清!Java 运行时异常和编译时异常的真正区别
java