策略模式简介

策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时根据需求选择不同的算法或行为。通过将算法封装成独立的策略类,使得它们可以相互替换,而不影响客户端代码。这种模式的核心思想是定义一系列算法,将它们封装起来,并使它们可以相互替换

策略模式通常包含以下角色:

  • Context(上下文):持有一个策略对象的引用,负责调用具体的策略。
  • Strategy(策略接口):定义所有支持的算法的公共接口。
  • ConcreteStrategy(具体策略):实现策略接口的具体算法类。

策略模式的应用场景

  1. 当一个系统需要动态地在多种算法中选择一种时。
  2. 当多个类仅在行为上有所不同,可以通过策略模式避免条件语句的重复。
  3. 当需要隐藏算法实现细节或提供灵活的算法扩展时。

策略模式的优点

  • 避免使用多重条件判断语句。
  • 提供开闭原则支持,可以灵活扩展新策略。
  • 算法可以自由切换,提高代码复用性。

策略模式的缺点

  • 客户端需要了解所有策略类,以选择合适的策略。
  • 策略类数量增多时,会增加系统的复杂性。

如果需要进一步了解策略模式的具体实现或示例代码,可以补充相关需求。

业务场景实现:

针对不同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");
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐