侧边栏壁纸
  • 累计撰写 12 篇文章
  • 累计创建 11 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

策略模式优化if-else

bingo
2022-05-09 / 0 评论 / 0 点赞 / 1,004 阅读 / 947 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-12-29,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

代码中出现过多的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自动映射调用即可。

三、总结

  1. 策略模式优化if-else的本质并不是去掉了这个逻辑判断,只是将逻辑判断抽象封装起来了,通过map来实现if-else中的逻辑判断。
  2. 策略模式精简优化庞大的if-else分支的同时也会增加很多的类,因此如果策略处理的逻辑并不复杂、情况不多的情况下没有必要使用策略模式。
  3. 当策略可预见的将来会非常快速的膨胀、策略的处理逻辑较为复杂的情况下,可以考虑使用这种策略模式优化代码结构,让代码更易于维护拓展。
0

评论区