基于SpringBoot的策略模式多实现类注入(Map注入)

2基础知识

=====

2.1对@Autowired注解的理解


在平常使用中我们对@Autowired都是这样用

@Autowired

private XXXService service;

解释说明:@Autowired是按照byType注入的(即按照bean的类型),当注入接口的时候我们都知道,他是注入的是这个接口的实现类,只不过引用是接口而已,当你调用其中的方法的时候,实质是调用接口实现的方法(多态原理),所以XXXService有多个实现类时,用上面代码块的方式进行注入,会报错。

3策略模式的引入

========

3.1代码展示:


3.1.1一个接口有多个实现

//接口

public interface Shape {

void draw();

}

//实
现1

@Service

public class Rectangle implements Shape {

@Override

public void draw() {

System.out.println(“Inside Rectangle::draw() method.”);

}

}

//实现2

@Serivce

public class Circle implements Shape {

@Override

public void draw() {

System.out.println(“Inside Circle::draw() method.”);

}

}

//实现3

@Service

public class Square implements Shape {

@Override

public void draw() {

System.out.println(“Inside Square::draw() method.”);

}

}

3.1.2 枚举类型

public enum SettingTypeEnum {

RECTANGLE(“1”,“Rectangle”, “矩形”),

SQUARE(“2”,“Square”, “正方形”),

CIRCLE(“3”,“Circle”, “圆形”),

;

public String code;

//接口的实现类名

public String implement;

//备注

public String desc;

SettingTypeEnum(String code,String implement, String desc) {

this.code = code;

this.implement = implement;

this.desc = desc;

}

}

3.3.3写工厂类获取实现类

注意:@Autowired把多个实现类注入Map是重点

@Component

public class ShapeBeanFactory {

@Autowired//关键在这个,原理:当一个接口有多个实现类的时候,key为实现类名,value为实现类对象

private Map<String, Shape> shapeMap;

@Autowired//这个注入了多个实现类对象

private List shapeList;

public Shape getShape(String shapeType) {

Shape bean1 = shapeMap.get(shapeType);

System.out.println(bean1);

return bean1;

}

}

3.3.4控制层(为了测试用,根据业务使用,不一定用在控制层)

@RestController

public class control {

Spring Boot 中使用策略模式结合 Map 的方式,你可以按照以下步骤进行实现: 1. 首先,定义一个接口,表示策略模式的抽象策略,例如: ```java public interface Strategy { String execute(); } ``` 2. 创建具体的策略实现接口,例如: ```java @Component public class StrategyA implements Strategy { @Override public String execute() { return "执行策略A"; } } @Component public class StrategyB implements Strategy { @Override public String execute() { return "执行策略B"; } } ``` 3. 在使用策略的地方,注入策略的集合,并通过 Map 存储,将策略的名称作为键,策略对象作为值,例如: ```java @Service public class StrategyService { private final Map<String, Strategy> strategyMap; public StrategyService(List<Strategy> strategyList) { this.strategyMap = new HashMap<>(); for (Strategy strategy : strategyList) { strategyMap.put(strategy.getClass().getSimpleName(), strategy); } } public String executeStrategy(String strategyName) { Strategy strategy = strategyMap.get(strategyName); if (strategy != null) { return strategy.execute(); } return "未找到对应的策略"; } } ``` 4. 在使用策略的地方调用 `executeStrategy()` 方法,并传入对应的策略名称,例如: ```java @RestController public class StrategyController { private final StrategyService strategyService; public StrategyController(StrategyService strategyService) { this.strategyService = strategyService; } @GetMapping("/execute/{strategyName}") public String executeStrategy(@PathVariable String strategyName) { return strategyService.executeStrategy(strategyName); } } ``` 这样,当访问 `/execute/StrategyA` 接口时,会执行策略A;访问 `/execute/StrategyB` 接口时,会执行策略B。你可以根据实际需求进行调整和扩展。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值