策略模式+简单工厂

步骤 1: 定义策略接口

首先,定义一个策略接口 IStrategy,包含所有策略实现应具备的行为。

public interface IStrategy {
    void execute();
}

步骤 2: 创建具体策略实现

根据需求,为每种策略创建具体的实现类。每个类将实现上面定义的接口,并执行具体的操作。

@Component
@LogicStrategy(logicMode = StrategyFactory.StrategyType.TYPE_ONE)
public class ConcreteStrategyOne implements IStrategy {
    public void execute() {
        System.out.println("Executing strategy one.");
    }
}
 
@Component
@LogicStrategy(logicMode = StrategyFactory.StrategyType.TYPE_TWO)
public class ConcreteStrategyTwo implements IStrategy {
    public void execute() {
        System.out.println("Executing strategy two.");
    }
}

步骤 3: 定义枚举和注解

定义一个注解,用于标识每个策略实现类的类型。此注解将与内部定义的枚举关联。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogicStrategy {
    StrategyFactory.StrategyType logicMode();
}
 
public class StrategyFactory {
    @Getter
    @AllArgsConstructor
    public enum StrategyType {
        TYPE_ONE("type_one", "Description for Type One"),
        TYPE_TWO("type_two", "Description for Type Two");
 
        private final String code;
        private final String info;
    }
}

步骤 4: 实现策略工厂

构建策略工厂,该工厂会根据传入的字符串描述动态选择并返回相应的策略实例。此工厂使用一个 ConcurrentHashMap 来存储策略描述与策略实例的映射。

@Service
public class StrategyFactory {
    private ConcurrentHashMap<String, IStrategy> strategies = new ConcurrentHashMap<>();
 
    public StrategyFactory(List<IStrategy> strategyList) {
        strategyList.forEach(strategy -> {
            LogicStrategy annotation = AnnotationUtils.findAnnotation(strategy.getClass(), LogicStrategy.class);
            if (annotation != null) {
                strategies.put(annotation.logicMode().getCode(), strategy);
            }
        });
    }
 
    public IStrategy getStrategy(String code) {
        return strategies.get(code);
    }
 
    public Map<String, IStrategy> getAllStrategies() {
        return (Map<String, IStrategy>) (Map<?, ?>)strategies;
    }
}

步骤 5: 使用工厂获取和执行策略

创建客户端代码,它通过策略工厂获取并执行指定描述的策略。客户代码不需要知道枚举或策略实现,只需要传入一个描述字符串。

public class ClientClass {
    @Autowired
    private StrategyFactory strategyFactory;
 
    public void performAction(String code) {
        IStrategy strategy = strategyFactory.getStrategy(code);
        if (strategy != null) {
            strategy.execute();
        } else {
            System.out.println("No strategy found for description: " + description);
        }
    }
}
posted @ 2025-07-11 14:52  庚申码上仙  阅读(7)  评论(0)    收藏  举报