JAVA 策略模式+工厂模式

项目使用策略模式来处理不同类型的API配置,通过ApiConfigStrategy接口和具体的策略实现类来统一管理不同类型的API。

核心接口

  • ApiConfigStrategy: 定义了API配置的通用操作接口
    • add(): 添加API配置
    • edit(): 编辑API配置
    • info(): 获取API配置信息
    • supports(): 判断是否支持特定API类型
java 复制代码
public interface ApiConfigStrategy {

    void edit(ApiUpdateDTO apiEditDTO);

    void add(ApiCreateDTO apiCreateDTO);

    ApiConfig info(ApiConfig apiConfig);

    boolean supports(String apiType);
}

抽象基类

  • AbstractApiConfigStrategy: 提供了保存API基础配置的通用方法
java 复制代码
public abstract class AbstractApiConfigStrategy implements ApiConfigStrategy {

    @Resource
    private ApiConfigDao apiConfigDao;

    protected Long saveApiConfig(ApiCreateDTO apiCreateDTO) {
        ApiConfig apiConfig = apiConfigDao.save(ApiConfig.builder()
                .apiName(apiCreateDTO.getApiName())
                .requestTimeLimit(apiCreateDTO.getRequestTimeLimit())
                .timeOut(apiCreateDTO.getTimeOut())
                .status(ApiConfig.STATUS_ONLINE)
                .comment(apiCreateDTO.getComment())
                .createTime(new Date())
                .build());
        return apiConfig.getId();
    }
}

策略实现

1. ApiHttpStrategy - HTTP API

  • API类型: http
    • 功能: 处理HTTP接口类型的API配置
    • 关键字段:
    • url: HTTP请求地址
    • method: HTTP请求方法(GET/POST)
    • 校验: URL和方法不能为空,方法只能是GET或POST
java 复制代码
@Component
public class ApiHttpStrategy extends AbstractApiConfigStrategy {

    @Resource
    ApiHttpConfigDao apiHttpConfigDao;

    @Override
    public void edit(ApiUpdateDTO apiEditDTO) {
        dataCheckAdd(apiEditDTO);

      apiHttpConfigDao.save(ApiHttpConfig.builder()
                 .apiId(apiEditDTO.getId())
                 .url(apiEditDTO.getUrl())
                 .method(apiEditDTO.getMethod())
                 .build());
    }

    @Override
    public void add(ApiCreateDTO apiCreateDTO) {
        apiHttpConfigDao.save(ApiHttpConfig.builder().apiId(saveApiConfig(apiCreateDTO))
                .url(apiCreateDTO.getUrl())
                .method(apiCreateDTO.getMethod())
                .build());
    }

    @Override
    public ApiConfig info(ApiConfig apiConfig) {
        apiConfig.setApiHttpConfig(apiHttpConfigDao.findByApiId(apiConfig.getId()));
        return apiConfig;
    }

    @Override
    public boolean supports(String apiType) {
        return ApiConfig.API_TYPE_HTTP.equals(apiType);
    }

    private void dataCheckAdd(ApiUpdateDTO apiEditDTO) {
    
    }

}

2. ApiFeignStrategy - Feign API

  • API类型: feign
    • 功能: 处理Feign客户端类型的API配置
    • 关键字段:
    • serverName: 服务名称
    • urlPath: 服务路径
    • 校验: 服务名称和路径不能为空
java 复制代码
@Component
public class ApiFeignStrategy extends AbstractApiConfigStrategy {

    @Resource
    ApiFeignConfigDao apiFeignConfigDao;

    @Override
    public void edit(ApiUpdateDTO apiEditDTO) {
        dataCheckAdd(apiEditDTO);
        apiFeignConfigDao.save(ApiFeignConfig.builder()
                  .apiId(apiEditDTO.getId())
                  .serverName(apiEditDTO.getServerName())
                  .url(apiEditDTO.getUrlPath())
                  .build());
    
    }
    

    @Override
    public void add(ApiCreateDTO apiCreateDTO) {
        apiFeignConfigDao.save(ApiFeignConfig.builder().apiId(saveApiConfig(apiCreateDTO))
                .serverName(apiCreateDTO.getServerName())
                .url(apiCreateDTO.getUrlPath())
                .build());
    }

    @Override
    public ApiConfig info(ApiConfig apiConfig) {
        apiConfig.setApiFeignConfig(apiFeignConfigDao.findByApiId(apiConfig.getId()));
        return apiConfig;
    }

    @Override
    public boolean supports(String apiType) {
        return ApiConfig.API_TYPE_FEIGN.equals(apiType);
    }

    private void dataCheckAdd(ApiUpdateDTO apiEditDTO) {
 
    }

}

service调用

java 复制代码
@Service
public class ApiConfigServiceImpl implements ApiConfigService {

	  @Autowired
    ApiConfigStrategyFactory apiConfigStrategyFactory;


  public void edit(ApiUpdateDTO apiUpdateDTO) {
        try {
            ApiConfigStrategy apiConfigStrategy = apiConfigStrategyFactory.getStrategy(apiUpdateDTO.getApiType());
            apiConfigStrategy.edit(apiUpdateDTO);
        } catch (Exception e) {
            log.error("edit apiConfig error", e);
            throw new RuntimeException("edit apiConfig error");
        }
    }
}

设计优点

  1. 设计模式优点
  2. 可扩展性: 添加新的API类型只需实现ApiConfigStrategy接口
  3. 可维护性:每种API类型有独立的处理逻辑,互不影响
  4. 复用性: AbstractApiConfigStrategy提供了通用的API基础配置保存方法
  5. 类型安全: 通过supports()方法确保正确的策略被调用
相关推荐
执风挽^1 小时前
Python基础编程题2
开发语言·python·算法·visual studio code
程序员泠零澪回家种桔子1 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
Z9fish1 小时前
sse哈工大C语言编程练习20
c语言·开发语言·算法
CodeCaptain1 小时前
nacos-2.3.2-OEM与nacos3.1.x的差异分析
java·经验分享·nacos·springcloud
萧鼎1 小时前
Python 包管理的“超音速”革命:全面上手 uv 工具链
开发语言·python·uv
Anastasiozzzz2 小时前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
骇客野人2 小时前
通过脚本推送Docker镜像
java·docker·容器
刘琦沛在进步2 小时前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++
机器视觉的发动机2 小时前
AI算力中心的能耗挑战与未来破局之路
开发语言·人工智能·自动化·视觉检测·机器视觉
铁蛋AI编程实战2 小时前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python