什么是策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context
对象的执行算法。
简而言之,就是可以根据不同业务类型,去实现相对应的逻辑。有多种类似的场景需要处理的时候,可以避免N多的if…else…(不过也是需要看实际情况去运用)。
假如现在有一个业务场景:游戏活动中玩家每日签到,一周7天中完成签到的条件都不一样,发送的奖励也不一样。除了可以简单地用if…else…去进行判断以外,也可以用上这略模式,并且以后需求变更的时候,还便于扩展和修改。
大概流程:

用个简单的demo说明一下:
Strategy 抽象类定义行为
/**
* 策略
* 执行签到奖励或者其他逻辑
*/
public interface Strategy {
void doSomething();
}
具体行为:
public class Example_1 implements Strategy {
@Override
public void doSomething() {
System.out.println("-----day 1-----");
}
}
public class Example_2 implements Strategy {
@Override
public void doSomething() {
System.out.println("-----day 2::奖励铜币-----");
}
}
public class Example_3 implements Strategy {
@Override
public void doSomething() {
System.out.println("-----day 3:奖励金币-----");
}
}
用枚举定义其行为类型:
/**
* 天数枚举
*/
public enum SignInEnum {
DAY_1,
DAY_2,
DAY_3;
}
测试例子:
public class TestDemo {
// 定义策略map缓存
private static final Map<Integer, Strategy> map = new HashMap<>();
//后期需要拓展,只需要按此模式进行新增即可
static {
map.put(SignInEnum.DAY_1.ordinal(), new Example_1());
map.put(SignInEnum.DAY_2.ordinal(), new Example_2());
map.put(SignInEnum.DAY_3.ordinal(), new Example_3());
}
public static void main(String[] args) {
//玩家执行签到流程
Strategy strategy = map.get(SignInEnum.DAY_1.ordinal());
strategy.doSomething();
}
}
总结
优点:
- 扩展性好,如果要添加新的策略,可以直接新加一个类
- 提高代码可读性易用性,降低维护成本
缺点:
- 一旦策略多起来,维护成本也会增加,而且要去理解并选择适合的策略去处理业务
其实当初在用策略模式的时候,刚开始并没有意识到自己写的就是设计模式的一种。所以学习设计模式不能够去生搬硬套,一定要结合自己的理解,在业务中用上学到的知识才能够使开发事半功倍,不能够为了用而用,那样子就失去了意义,切勿生搬硬。
本文介绍策略模式的概念及其在游戏签到奖励场景的应用。通过定义一系列可互换的算法族,策略模式使得算法可以独立于使用它的客户端而变化。文章提供了一个简单的示例来展示如何使用策略模式简化代码并提高扩展性。

被折叠的 条评论
为什么被折叠?



