什么是策略模式
以前我们写代码的时候会经常用到if esle if,比如要判断十多种类型,每个类型都要使用if else if来判断,判断里面又有写大量的逻辑,代码耦合性太高,不利于后期拓展。策略模式就是解决这个问题的,讲每个判断逻辑单独抽取出来,通过类型直接去执行这个逻辑的代码块。
策略模式角色
抽象类:一般是接口或者抽象类
实例类:实现接口或者继承抽象类的子类,具体业务代码实现
context:spring上下文,spring是一个key value的类型,key就是类名的驼峰命名,value就是类型,实例类创建都在sprng里的
应用场景
我需要查询不同类型的订单,app订单、商机订单、小程序订单在后台模块展示出来。
定义一个接口
public interface OrderService {
/**
* 查询订单
*/
public void getOrderList();
}
创建AppOrder实现OrderService
/**
* app订单
*/
@Service("app")
public class AppOrder implements OrderService {
@Override
public void getOrderList() {
System.out.println("查询app订单");
}
}
创建ChannelOrder实现OrderService
/**
* 商机订单
*/
@Service("channel")
public class ChannelOrder implements OrderService {
@Override
public void getOrderList() {
System.out.println("查询商机订单");
}
}
创建SmallOrder实现OrderService
/**
* 小程序订单
*/
@Service("small")
public class SmallOrder implements OrderService {
@Override
public void getOrderList() {
System.out.println("查询小程序订单");
}
}
通过spring上下文获取不同的实例类型,map<String, OrderService> map,@Service(“small”)和@Service(“channel”)就是key,ChannelOrder 和SmallOrder就是类型,是OrderService的子类,type就是前端需要传进来的key。
@Component
public class OrderFactory {
@Autowired
private Map<String, OrderService> map;
public void handel(String type){
OrderService orderService = map.get(type);
orderService.getOrderList();
}
}
controller测试
http://localhost:8080/orderList?type=1
http://localhost:8080/orderList?type=2
@RestController
public class OrderController {
@Autowired
private OrderFactory orderFactory;
@GetMapping("/orderList")
public void orderList(String type){
orderFactory.handel(type);
}
}