spring中策略模式使用

Easter79
• 阅读 335

策略模式

工作中经常使用到策略模式+工厂模式,实现一个接口多种实现的灵活调用与后续代码的扩展性。在spring中使用策略模式更为简单,所有的bean均为spring容器管理,只需获取该接口的所有实现类即可。

下面以事件处理功能为例,接收到事件之后,根据事件类型调用不同的实现接口去处理。如需新增事件,只需扩展实现类即可,无需改动之前的代码。这样即做到了功能的隔离,又可防止改动原代码导致的bug。

类图

spring中策略模式使用

代码示例

定义接口

public interface IBaseEventService {

    /**
     * 处理事件
     * @param eventObject
     * @return
     * @throws Exception
     */
    public boolean dealEvent(String eventObject);

    /**
     * 获取事件类型
     * @return
     */
    public String getType();

}

接口实现

@Service
public class AddUserEventServiceImpl implements IBaseEventService {
    @Override
    public boolean dealEvent(String eventObject) {
        // TODO 业务处理逻辑
        return false;
    }

    @Override
    public String getType() {
        return EventTypeEnum.ADD_USER_AFTER.getKey();
    }
}

常量定义

public enum EventTypeEnum {
    ADD_USER_AFTER("ADD_USER_AFTER"),
    PLACE_ORDER_AFTER("PLACE_ORDER_AFTER");

    private String key;

    EventTypeEnum(String key) {
        this.key = key;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }
}

策略类

@Service
public class EventStrategyService {

    Map<String, IBaseEventService> eventServiceMap = new HashMap<>();

    /**
     * 构造函数
     * @param eventServices spring容器中所有IBaseEventService的实现类
     */
    public EventStrategyService(List<IBaseEventService> eventServices) {
        for (IBaseEventService eventService : eventServices) {
            eventServiceMap.put(eventService.getType(), eventService);
        }
    }
    
    /**
     * 根据事件类型调用不同的实现类处理
     */
    public boolean dealEvent(String eventType, String eventObject) {
        IBaseEventService eventService = eventServiceMap.get(eventType);
        if (eventService == null){
            throw new BizException("未找到事件处理实现类,eventType:" + eventType);
        }
        return eventService.dealEvent(eventObject);
    }

}

接口调用

    @Autowired
    private EventStrategyService eventStrategyService;
    
    //处理事件
    eventStrategyService.dealEvent(eventType, userObject);
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Event Bus 之 Otto(一)
Otto是EventBus模式的一种实现,使用它可以使事件的发送与处理解耦,为了坚挺某个事件不必再去实现相应的接口,只需简单的加标注、注册就可以实现。标注:首先来看两种标注:subscribe:@Retention(RetentionPolicy.RUNTIME)@Target(ElementTyp
Easter79 Easter79
2年前
Spring中的设计模式
spring在容器中使用了观察者模式:一、spring事件:ApplicationEvent,该抽象类继承了EventObject类,jdk建议所有的事件都应该继承自EventObject。二、spring事件监听器:ApplicationLisener,该接口继承了EventListener接口,jdk建议所有的事件监听器都应该继承Ev
Easter79 Easter79
2年前
Spring中ApplicationContext的事件机制
   ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理。如果容器中有一个ApplicationListenerBean,每当ApplicationContext发布ApplicationEvent时,
Wesley13 Wesley13
2年前
Java面试题总结
1)用过哪些设计模式,手写一个(除单例); 工厂模式,门面模式(个人有点像service层),代理模式2)springmvc的核心是什么,请求的流程是怎么处理的,控制反转怎么实现的; 1,用户发送请求至前端控制器DispatcherServlet 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器
Wesley13 Wesley13
2年前
Java设计模式
模式描述工厂方法模式提供一个用于创建产品的接口,由实现类决定实现哪些产品。工厂方法模式使一个类的实例化延迟到子类,并且只适用于一个产品的等级结构。优点可以一定程度上解耦,消费者和产品实现类隔离开,只依赖产品接口(抽象产品),产品实现类如何改动与消费者完全无关。例子还是以之前简单工厂的手机为案例:/
Wesley13 Wesley13
2年前
Java 设计模式系列(十二)策略模式(Strategy)
Java设计模式系列(十二)策略模式(Strategy)策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。一、策略模式的结构策略模式是对算
Wesley13 Wesley13
2年前
如何利用策略模式避免冗长的 if
策略模式。在实际的项目开发中,这个模式也比较常用。最常见的应用场景是,利用它来避免冗长的ifelse或switch分支判断。不过,它的作用还不止如此。它也可以像模板模式那样,提供框架的扩展点等等。对于策略模式。本篇我们讲解策略模式的原理和实现,以及如何用它来避免分支判断逻辑。后续我会通过一个具体的例子,来详细讲解策略模式的应用场景以及真正的设计意图
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k