应用场景一:
下图功能为 查询一个点 500千米内所有起降点,运输机场,通航机场,如果不使用策略模式那么前端同学需要进行循环遍历查询内容,拿到查询内容后调用对应内容的接口.或者前端同学传递内容后端同学if("固定起降点"){查询固定起降点接口}else if("运输机场"){查询运输机场接口}...会有很多if else 代码臃肿
![](https://img-blog.csdnimg.cn/img_convert/ef2702eddd5fbcf01238c5ffcccdd7a5.png)
应用场景二:
销售打折,普通买家打一折,会员打五折等等,折扣是会经常变化,如果不使用策略模式另外代码会有很多if("普通买家"){打一折}else if("会员"){打五折}....,会有很多判断代码会很臃肿,另外每次添加一种打折方式,都会修改原代码,违反了开闭原则.
我们以第二种应用场景来实现一下:
①首先要定义一个打折接口
/**
* 打折接口
*/
public interface DisCount {
/**
* 打折
*/
void discount();
/**
* 会员类型
* @return
*/
String getType();
}
②打一折实现类
@Component
public class OneFold implements DisCount {
@Override
public void discount() {
System.out.println("打一折");
}
@Override
public String getType() {
return "超级会员";
}
}
③打五折实现类
@Component
public class FiveFold implements DisCount {
@Override
public void discount() {
System.out.println("打五折");
}
@Override
public String getType() {
return "会员";
}
}
④打八折实现类
@Component
public class EightFold implements DisCount {
@Override
public void discount() {
System.out.println("打八折");
}
@Override
public String getType() {
return "普通买家";
}
}
⑤打折处理类,利用spring高级注入(spring可以将所有实现了同一接口的实现类注入到list当中),有了这个处理类的好处就是如果再有别的打折方式,只需要实现打折接口,spring会将所有实现类注入list当中,遍历list,将实现类以 打折方式-打折实现类方式 存储到map中,不需要我们手动添加
@Component
public class DiscountHandler {
Map<String, DisCount> discountMap = new HashMap<>(4);
//spring高级注入
public DiscountHandler(List<DisCount> personList){
for (DisCount person : personList) {
discountMap.put(person.getType(),person);
}
}
public Map<String, DisCount> getDiscountMap(){
return discountMap;
}
}
⑥测试
@Test
public void springAuto(){
Map<String, DisCount> discountMap = discountHandler.getDiscountMap();
discountMap.get("普通").discount();//打八折
}