<aside> 💡
策略模式(Strategy):定义了算法家族(这些算法完成的是相同的工作,只是实现不同),分别封装起来,让它们之间可以互相替换。此模式让算法的变化不会影响到使用算法的用户
</aside>
https://kamacoder.com/problempage.php?pid=1082
#include <iostream>
using namespace std;
class Strategy {
public:
virtual int applyDiscount(int price) = 0;
virtual ~Strategy(){};
};
class ConcreteStrategy1 : public Strategy {
public:
int applyDiscount(int price) override {
return price * 0.9;
}
};
class ConcreteStrategy2 : public Strategy {
public:
int applyDiscount(int price) override {
if (price >= 300) {
price -= 40;
}
else if (price >= 200) {
price -= 25;
}
else if (price >= 150) {
price -= 15;
}
else if (price >= 100) {
price -= 5;
}
return price;
}
};
// 融合了简单工厂的思想
// 传入一个选项(或具体的策略对象),调用该对象的算法方法
class Context {
public:
Context(int type) {
switch (type) {
case 1:
strategy = new ConcreteStrategy1();
break;
case 2:
strategy = new ConcreteStrategy2();
break;
}
}
~Context() {
delete strategy;
}
// Context类调用该接口
int getResult(int price) {
return strategy->applyDiscount(price);
}
private:
Strategy* strategy;
};
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
int price;
int type;
cin >> price >> type;
Context context(type);
cout << context.getResult(price) << endl;
}
return 0;
}