策略模式+简单工厂
步骤 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);
}
}
}

浙公网安备 33010602011771号