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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?