马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
起首,界说接口或抽象父类。比方,界说一个Strategy接口,内里有execute方法。然后差别的计谋类实现这个接口,好比ConcreteStrategyA、ConcreteStrategyB等,每个类用@Component注解,大概指定Bean的名字,大概用默认的类名首字母小写作为Bean名称。
然后,必要将这些Bean主动注入到一个Map中。Spring支持将同一范例的Bean注入到Map中,此中键是Bean的名称,值是对应的实例。比方,在某个服务类中,利用@Autowired private Map<String, Strategy> strategies; 如许,Spring会主动将全部的Strategy实现类放入这个Map,键是Bean的名称。
接下来,当必要实行某个计谋时,根据传入的key(即Bean的名称)从Map中获取对应的实例,调用其execute方法。比方,在服务类中有一个方法,罗致计谋名称作为参数,然后调用strategies.get(name).execute()。
在Spring框架中,利用计谋模式并团结依靠注入可以通过以下步调实现将子类实例存入Map,并通过指定名称实行对应方法:
1. 界说计谋接口或抽象类
- public interface PaymentStrategy {
- void processPayment(double amount);
- }
复制代码 2. 实现具体计谋类(子类)
利用@Component并为每个计谋指定唯一的Bean名称:
- @Component("creditCard")
- public class CreditCardPayment implements PaymentStrategy {
- @Override
- public void processPayment(double amount) {
- System.out.println("使用信用卡支付:" + amount);
- }
- }
- @Component("alipay")
- public class AlipayPayment implements PaymentStrategy {
- @Override
- public void processPayment(double amount) {
- System.out.println("使用支付宝支付:" + amount);
- }
- }
复制代码 3. 注入计谋Map并实行
- @Service
- public class PaymentService {
- private final Map<String, PaymentStrategy> strategies;
- // 通过构造器注入,Key为Bean名称,Value为实例
- @Autowired
- public PaymentService(Map<String, PaymentStrategy> strategyMap) {
- this.strategies = strategyMap;
- }
- public void executePayment(String method, double amount) {
- PaymentStrategy strategy = strategies.get(method);
- if (strategy == null) {
- throw new IllegalArgumentException("无此支付方式: " + method);
- }
- strategy.processPayment(amount);
- }
- }
复制代码 4. 利用示例
- @RestController
- public class PaymentController {
- @Autowired
- private PaymentService paymentService;
- @PostMapping("/pay")
- public String pay(@RequestParam String method, @RequestParam double amount) {
- paymentService.executePayment(method, amount);
- return "支付成功";
- }
- }
复制代码 关键点阐明
- 主动注入Map:Spring会主动将雷同范例(PaymentStrategy)的Bean注入到Map中,Key为Bean名称,Value为实例。
- 计谋扩展:新增付出方式只需添加实现类并用@Component("新名称")标记,无需修改其他代码。
- 非常处理处罚:当传入不存在的Key时,需处理处罚计谋未找到的情况(如抛出非常或返回默认计谋)。
自界说Map键名(可选)
若需利用非Bean名称的Key,可通过自界说注解实现:
界说注解:
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.TYPE)
- public @interface PaymentType {
- String value();
- }
复制代码 应用注解到计谋类:
- @Component
- @PaymentType("credit")
- public class CreditCardPayment implements PaymentStrategy { ... }
复制代码 手动构建计谋Map:
- @Service
- public class PaymentService {
- private final Map<String, PaymentStrategy> strategies = new HashMap<>();
- @Autowired
- public PaymentService(List<PaymentStrategy> strategyList) {
- for (PaymentStrategy strategy : strategyList) {
- PaymentType annotation = strategy.getClass().getAnnotation(PaymentType.class);
- if (annotation != null) {
- strategies.put(annotation.value(), strategy);
- }
- }
- }
- // 其他代码不变
- }
复制代码 这种方法答应更机动地界说计谋名称,同时保持代码的可扩展性。
@sercice(“queryability”)
public class QueryAbilityService implement Strategy{…}
private Map<String, Strategy> strategy;
strategy.get(“key”).ifPresent(handler->handler.onmessage(input));
|