xin
2025-10-17 ab0637e981ab4c85120ccde35ee24ec4abbe3e24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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);
        }
    }*/
 
}