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()方法确保正确的策略被调用
相关推荐
catino2 分钟前
spring-Bean
java·后端·spring
Java后端的Ai之路4 分钟前
14、Python - 责任链模式
服务器·开发语言·人工智能·python·责任链模式
深入云栈14 分钟前
Netty 4.2.x 源码深度解析 (十一):EventExecutor 业务线程池 —— 防止 IO 线程阻塞的并发模型
java·后端
吴声子夜歌18 分钟前
Java——基本类型
java·开发语言
「QT(C++)开发工程师」31 分钟前
C++11 std::unique_ptr — 独占所有权的智能指针
c语言·开发语言·c++·qt
不正经学生1 小时前
C语言动态内存管理(上):堆上的自由与责任
c语言·开发语言·c++·算法·面试
AI情绪识别开源1 小时前
检信AI高一分班分科智选评估系统 v2.0测试报告
开发语言·数据结构·人工智能·科技
纯.Pure_Jin(g)1 小时前
靶场PHP函数整理+防御方式
开发语言·php·ctf
CoderYanger2 小时前
A.每日一题:输入单词需要的最少按键次数 Ⅰ+Ⅱ
java·数据结构·算法·leetcode·面试
Cosolar2 小时前
一文弄懂 Agent Harness 与 Agent Runtime 的区别
java·后端·github