策略模式的小小设计
·
策略模式简介
策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时根据需求选择不同的算法或行为。通过将算法封装成独立的策略类,使得它们可以相互替换,而不影响客户端代码。这种模式的核心思想是定义一系列算法,将它们封装起来,并使它们可以相互替换。
策略模式通常包含以下角色:
- Context(上下文):持有一个策略对象的引用,负责调用具体的策略。
- Strategy(策略接口):定义所有支持的算法的公共接口。
- ConcreteStrategy(具体策略):实现策略接口的具体算法类。
策略模式的应用场景
- 当一个系统需要动态地在多种算法中选择一种时。
- 当多个类仅在行为上有所不同,可以通过策略模式避免条件语句的重复。
- 当需要隐藏算法实现细节或提供灵活的算法扩展时。
策略模式的优点
- 避免使用多重条件判断语句。
- 提供开闭原则支持,可以灵活扩展新策略。
- 算法可以自由切换,提高代码复用性。
策略模式的缺点
- 客户端需要了解所有策略类,以选择合适的策略。
- 策略类数量增多时,会增加系统的复杂性。
如果需要进一步了解策略模式的具体实现或示例代码,可以补充相关需求。
业务场景实现:
针对不同Agent需要初始化对应的业务数据,在需要时提升及时获取效率
这里会涉及整个框架的多个文件
DataHandler 定义多个方法的接口
public interface DataHandler {
void initData(Map<String, Object> params);
Object getData(int staffId, String staffName);
}
DataHandlerType 定义识别具体策略的自定义注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface DataHandlerType {
/**
* 初始化类型
*/
String source();
}
DataService 对外的访问入口,也算整个策略框架的代理
@Slf4j
@Service
public class DataService {
private Map<String, DataHandler> dataHandlerMap;
/**
* 系统启动时,针对有DataHandlerType注解的所有类进行初始化,存储于MAP。构造成策略池。
*
* @param orderHandlers 所有DataHandler实现类
*/
@Autowired
public void setStorageHandleMap(List<DataHandler> orderHandlers) {
// 过滤掉没有@DataHandlerType注解的实现类
dataHandlerMap = orderHandlers.stream()
.filter(orderHandler ->
AnnotationUtils.findAnnotation(orderHandler.getClass(),
DataHandlerType.class) != null)
.collect(Collectors.toMap(orderHandler -> {
DataHandlerType annotation = AnnotationUtils.findAnnotation(
orderHandler.getClass(), DataHandlerType.class);
return annotation.source(); // 这里annotation不会为null
},v -> v,(v1, v2) -> v1));
log.info("已初始化 {} 个数据处理器", dataHandlerMap.size());
}
public void initData(String botName, int staffId, String staffName) {
DataHandler convertHandler = getDataHandler(botName);
Map<String, Object> params = new HashMap<>();
params.put(FLEX_PARAM_FIELD_STAFF, staffId);
convertHandler.setFullKey(staffName);
convertHandler.initData(params);
}
public Object getData(String botName, int staffId, String staffName) {
DataHandler convertHandler = getDataHandler(botName);
return convertHandler.getData(staffId, staffName);
}
private DataHandler getDataHandler(String botName) {
DataHandler convertHandler = dataHandlerMap.get(botName);
if (convertHandler == null) {
log.error("机器人【botName={}】没有该初始化类型", botName);
throw new RuntimeException("没有该初始化类型");
}
return convertHandler;
}
}
FlexDataHandler 具体策略实现,实现DataHandler接口,实现不同Agent的业务逻辑,这里的核心主要在于添加声明的自定义注解,可被DataService在服务启动时识别策略的具体实现,进行统一管理
@Slf4j
@DataHandlerType(source = Tencent_Flex_Benefits)
public class FlexDataHandler implements DataHandler {
@Override
public void initData(Map<String, Object> params) {
try {
// 记录调试信息(包含关键参数)
log.debug("开始初始化商保数据, key: {}, params: {}", fullKey, params);
ResponseInfo<List<InsuranceProduct>> result =
fluxInvokeClientUtil.invokeApiGet(STAFF_PRODUCTS_URL, params);
// 对业务处理后的数据进行缓存起来
}
@Override
public Object getData(int staffId, String staffName) {
// 通过缓存快速获取所需数据
return redissonService.getProducts(staffId, staffName);
}
}
MetaDataController 接口访问调用策略代理
dataService.initData(dataSource,111906,"kavinsliu");
更多推荐

所有评论(0)