代码中出现过多的if-else分支时虽然并不会影响代码运行、功能实现,但是却会让代码逻辑分支过于庞大,不便于维护。而策略模式就是专门为优化if-else而生的。
一、什么是策略模式
策略模式实际上并没有优化掉if-else的逻辑判断过程,只是将这一过程抽象出来了,将其放到一个单独的类中进行管理,将不同的策略对应的不同行为抽象,利用lambada表达式通过一个map作映射调用。这样初步的实现了策略模式,但是还没有遵循开闭原则,即当需要增加新的策略时还需要修改主干代码。因此可以通过自注册的方式,让新增的具体策略自动注册到策略类中。
二、编码实操
需求:编写一个事件处理器,对不同类型的事件作不同的业务处理。
事件处理器context上下文对象:定义一个map,用于存放不同策略对应的事件处理方法,并提供一个统一处理事件的方法
/**
* 事件回调上下文对象
*
* @author bingo
* @date 2022/4/11 15:10
*/
public class EventHandlerContext {
public static final Map<String, Consumer<Event>> EVENT_HANDLER_MAP = new HashMap<>();
/**
* 处理事件
*/
public static void handleEvent(String eventType, Event event) {
EVENT_HANDLER_MAP.get(eventType).accept(event);
}
}
事件处理器接口:定义一个默认的事件处理器注册方法;定义一个注册接口、处理事件接口,具体事件处理器实现类需要实现这两个接口,实现自动注册功能,以及自己具体的事件处理逻辑
/**
* 事件处理器接口
*
* @author bingo
* @date 2022/4/11 15:03
*/
public interface EventHandler {
/**
* 初始化注册处理器
*
* @param eventType 事件类型
*/
default void register(String eventType) {
EventHandlerContext.EVENT_HANDLER_MAP.putIfAbsent(eventType, this::handleEvent);
}
/**
* 初始化事件处理器注册
* <p>通过调用默认register方法,指定当前事件处理器对应的名称进行注册
* <p>该方法需要使用@PostConstruct注解,在创建类时自动执行
*/
void register();
/**
* 事件处理方法
*
* @param event 事件
*/
void handleEvent(Event event);
}
具体的策略实现类:实现注册方法,用@PostConstruct修饰,类创建时自动注册到context中的map中;实现具体业务事件处理逻辑
/**
* 具体策略实现
*
* @author bingo
* @since 2022-04-01 15:00:00
*/
@Service
public class XXXEventHandler implements EventHandler {
@PostConstruct
@Override
public void register() {
register("XXXEvent");
}
@Override
public void handleEvent(Event event) {
// 具体的业务逻辑,对事件如何处理。。。
}
}
至此,每当有新添加的策略时,只需要实现策略接口,实现策略处理的方法、策略注册方法,把策略自动注册到策略map中,再通过策略context自动映射调用即可。
三、总结
- 策略模式优化if-else的本质并不是去掉了这个逻辑判断,只是将逻辑判断抽象封装起来了,通过map来实现if-else中的逻辑判断。
- 策略模式精简优化庞大的if-else分支的同时也会增加很多的类,因此如果策略处理的逻辑并不复杂、情况不多的情况下没有必要使用策略模式。
- 当策略可预见的将来会非常快速的膨胀、策略的处理逻辑较为复杂的情况下,可以考虑使用这种策略模式优化代码结构,让代码更易于维护拓展。
评论区