zoukankan      html  css  js  c++  java
  • spring中策略模式使用

    策略模式

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

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

    类图

    代码示例

    定义接口

    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);
    
  • 相关阅读:
    Angular使用$compile为从Ajax加载的HTML绑定ng-click事件
    js获取判断苹果手机机型
    工作中遇到的常见问题
    js实现文字超出部分用省略号代替实例代码
    微信企业号开发之weixin://preInjectJSBridge/fail
    构造函数,super()
    微信企业号开发之 企业号人员身份认证与开发
    微信企业号开发之回调模式的接口开发
    微信公众号开发的开发环境要求和准备工作
    react-router 中的history(react中关于后退键的处理用的到)
  • 原文地址:https://www.cnblogs.com/iiot/p/11332036.html
Copyright © 2011-2022 走看看