【设计模式】C++策略模式

先看题目:


【设计模式专题之策略模式】14. 超市打折

时间限制:1.000S  空间限制:256MB

题目描述

小明家的超市推出了不同的购物优惠策略,你可以根据自己的需求选择不同的优惠方式。其中,有两种主要的优惠策略: 

1. 九折优惠策略:原价的90%。 

2. 满减优惠策略:购物满一定金额时,可以享受相应的减免优惠。

具体的满减规则如下: 

满100元减5元 

满150元减15元 

满200元减25元 

满300元减40元

请你设计一个购物优惠系统,用户输入商品的原价和选择的优惠策略编号,系统输出计算后的价格。

输入描述

输入的第一行是一个整数 N(1 ≤ N ≤ 20),表示需要计算优惠的次数。 

接下来的 N 行,每行输入两个整数,第一个整数M( 0 < M < 400) 表示商品的价格, 第二个整数表示优惠策略,1表示九折优惠策略,2表示满减优惠策略

输出描述

每行输出一个数字,表示优惠后商品的价格

输入示例
4
100 1
200 2
300 1
300 2
输出示例
90
175
270
260

我的实现:

#include<iostream>
#include<vector>
using namespace std;
class Calculate {
public:
	virtual double Cal(int&)=0;
};
class Discount1 :public Calculate {
	double Cal(int& val)override {
		return val * 0.9;
	}
};
class Discount2 :public Calculate {
	double Cal(int& val)override {
		if (val >= 100 && val < 150)
			return val - 5;
		else if (val >= 150 && val < 200)
			return val - 15;
		else if (val >= 200 && val < 300)
			return val - 25;
		else if (val >= 300)
			return val - 40;//此处可用数组优化
	}
};
class Calu {
private:
	Calculate* pc;
	int val;
public:
	Calu(int va,int way):val(va) {
		if (way == 1)
			pc = new Discount1;
		else if (way == 2)
			pc = new Discount2;
	}
	double Cal(){
		return pc->Cal(val);
	}
	~Calu() {
		delete pc;
	}
};
class market {
private:
	vector<double>cart;
	int size;
public:
	market() :size(0) {};
	market(int siz) :size(siz) { cart.reserve(siz); };
	void Buy() {
		int val;
		int way;
		for (int i = 0; i < size; i++)
		{
			cin >> val >> way;
			Calu c(val, way);
			cart.push_back(c.Cal());
		}
}
	void show() {
		for (int i = 0; i < size; i++)
		{
			cout << cart[i] << endl;
		}
	}
};
int main()
{
	int size;
	cin >> size;
	market ma(size);
	ma.Buy();
	ma.show();
}

GPT对此的点评:

策略模式允许在运行时选择算法的行为。在你的代码中,Calculate 类是一个策略接口,定义了算法族的接口。Discount1Discount2 是具体的算法实现。Calu 类充当了上下文角色,持有一个 Calculate 类型的指针,根据不同的情况选择具体的算法。

客户端代码通过调用 Calu 的成员函数来执行特定的算法,但不直接与具体的算法实现类耦合,从而实现了算法的灵活切换。这符合策略模式的核心思想。

总之,你的代码实现了策略模式,通过运行时动态选择不同的策略(Discount1 或 Discount2)来实现相同的功能(计算价格)。

原文链接:

【设计模式专题之策略模式】14. 超市打折

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值