基于自定注解,实现策略模式

125 阅读2分钟

第一次写帖子,留个脚印,只是因为上个项目中使用自定义注解方式注册bean看起来稍微优雅一点.

在Spring Boot中实现基于自定义注解的策略模式是一种常见的设计模式,它可以帮助我们根据不同的条件动态选择不同的策略实现。以下是实现这一模式的基本步骤和示例代码。

步骤 1: 定义策略接口

首先定义一个策略接口,所有的策略实现类都将实现这个接口。

public interface Strategy {
    void execute();
}

步骤 2: 创建策略实现类

创建具体的策略实现类,这些类将实现策略接口。

@Service
public class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("Executing Strategy A");
    }
}

@Service
public class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("Executing Strategy B");
    }
}

步骤 3: 定义自定义注解

定义一个自定义注解,用于标记策略方法。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface StrategyAnnotation {
    String value();
}

步骤 4: 创建策略工厂

创建一个策略工厂,用于根据自定义注解的值动态选择策略实现。

@Service
public class StrategyFactory {
    private final Map<String, Strategy> strategyMap = new HashMap<>();

    @Autowired
    public StrategyFactory(List<Strategy> strategies) {
        strategies.forEach(strategy -> {
            StrategyAnnotation annotation = strategy.getClass().getAnnotation(StrategyAnnotation.class);
            if (annotation != null) {
                strategyMap.put(annotation.value(), strategy);
            }
        });
    }

    public Strategy getStrategy(String strategyType) {
        return strategyMap.get(strategyType);
    }
}

步骤 5: 使用自定义注解

在策略实现类上使用自定义注解,指定策略类型。

@Service
@StrategyAnnotation("A")
public class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("Executing Strategy A");
    }
}

@Service
@StrategyAnnotation("B")
public class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("Executing Strategy B");
    }
}

步骤 6: 配置Spring Boot

在Spring Boot的配置类中,扫描带有自定义注解的类。

@Configuration
@ComponentScan(basePackages = "com.example", includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = StrategyAnnotation.class))
public class StrategyConfiguration {
}

步骤 7: 使用策略

在需要使用策略的地方,通过策略工厂获取相应的策略实现,并执行。

@RestController
public class StrategyController {
    @Autowired
    private StrategyFactory strategyFactory;

    @GetMapping("/execute/{strategyType}")
    public void executeStrategy(@PathVariable String strategyType) {
        Strategy strategy = strategyFactory.getStrategy(strategyType);
        strategy.execute();
    }
}