package com.oying.modules.pc.product.service.impl;
|
|
import com.oying.modules.pc.product.domain.dto.ProductCreateRequest;
|
import com.oying.modules.pc.product.domain.enums.ProductCreationType;
|
import com.oying.modules.pc.product.service.ProductCreationStrategy;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.PostConstruct;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.function.Function;
|
import java.util.stream.Collectors;
|
|
@Component
|
public class ProductCreationContext {
|
|
private final Map<ProductCreationType, ProductCreationStrategy> strategies;
|
|
// Spring会自动注入所有ProductCreationStrategy的实现
|
public ProductCreationContext(List<ProductCreationStrategy> strategyList) {
|
this.strategies = strategyList.stream()
|
.collect(Collectors.toMap(
|
ProductCreationStrategy::getType,
|
Function.identity()
|
));
|
}
|
|
@PostConstruct
|
public void validateStrategies() {
|
if (strategies.isEmpty()) {
|
throw new IllegalStateException("未配置任何商品创建策略,应用无法正常启动");
|
}
|
}
|
|
public void createProduct(ProductCreateRequest request, ProductCreationType type) {
|
|
ProductCreationStrategy strategy = strategies.get(type);
|
|
if (strategy == null) {
|
throw new IllegalArgumentException("不支持的创建类型或参数类型不匹配");
|
}
|
|
strategy.create(request);
|
|
// 使用反射调用,或者更好的方式...
|
// invokeStrategy(strategy, request);
|
}
|
|
/*
|
private void invokeStrategy(ProductCreationStrategy<?> strategy, ProductCreationRequest request) {
|
try {
|
Method createMethod = strategy.getClass().getMethod("create", request.getClass());
|
createMethod.invoke(strategy, request);
|
} catch (Exception e) {
|
throw new RuntimeException("执行商品创建策略失败", e);
|
}
|
}*/
|
|
}
|