策略模式
啃得鸡的节流策略很成功,但是节流是有上限的。内卷完了,还是要想想怎么开源。
于是相到通过促销的方式培养用户习惯。
现在有两个促销:
- 一、三、五 薯条免费
- 二、四、六 冰淇淋半价
# 场景分析
现在我们有两个需要做的策略,需要随着时间的变化,去执行不同的策略。
执行策略的主体的不变的,行为是变化的。
策略模式是对算法的封装,将一组算法和算法作用的数据分开,使算法可以独立变化。
通过抽提共有接口,每个算法单独封装,算法之间可以相互替换。
# 实现
# 代码
接口:
class SaleStrategyInterface
{
public:
virtual ~SaleStrategyInterface() {}
virtual void promotion() = 0;
};
1
2
3
4
5
6
2
3
4
5
6
实现:
class IceCream_halfFareImpl : public SaleStrategyInterface
{
public:
virtual void promotion() override
{
qDebug() << QStringLiteral("冰淇淋半价!");
}
};
class Chips_freeImpl : public SaleStrategyInterface
{
public:
virtual void promotion() override
{
qDebug() << QStringLiteral("薯条免费!");
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
使用:
class Shop
{
public:
Shop():m_pStrategy(nullptr) {}
~Shop() {delete m_pStrategy;}
void sell()
{
m_pStrategy->promotion();
}
void getStrategy(SaleStrategyInterface *strategy)
{
delete m_pStrategy;
m_pStrategy = strategy;
}
private:
SaleStrategyInterface *m_pStrategy;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 代码位置
设计模式/Strategy (opens new window)
# 使用感悟
策略模式的本质是对算法的封装,使算法的使用者和算法本身可以自由变化。
优点:1、扩展性好;2、可以自由切换策略,对象复用性高
缺点:所有算法都需要暴露给客户段,维护成本变高
可以考虑结合简单工厂,对策略本身也进行一层封装;减少暴露。
编辑 (opens new window)
上次更新: 2023/04/09, 11:59:04