策略模式
工作中经常使用到策略模式+工厂模式,实现一个接口多种实现的灵活调用与后续代码的扩展性。在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"), VERIFY_ENTER_AFTER("VERIFY_ENTERPRISE_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);