项目使用策略模式来处理不同类型的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");
}
}
}
设计优点
- 设计模式优点
- 可扩展性: 添加新的API类型只需实现ApiConfigStrategy接口
- 可维护性:每种API类型有独立的处理逻辑,互不影响
- 复用性: AbstractApiConfigStrategy提供了通用的API基础配置保存方法
- 类型安全: 通过supports()方法确保正确的策略被调用