先看题目:
【设计模式专题之策略模式】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
类是一个策略接口,定义了算法族的接口。Discount1
和Discount2
是具体的算法实现。Calu
类充当了上下文角色,持有一个Calculate
类型的指针,根据不同的情况选择具体的算法。客户端代码通过调用
Calu
的成员函数来执行特定的算法,但不直接与具体的算法实现类耦合,从而实现了算法的灵活切换。这符合策略模式的核心思想。总之,你的代码实现了策略模式,通过运行时动态选择不同的策略(Discount1 或 Discount2)来实现相同的功能(计算价格)。