目前在做的业务中需要根据配置发放不同的奖励,包括:红包、券、实物等,最直观的做法是if else判断执行不同的发奖逻辑,但是分支太多了容易混淆,代码可读性也差,索性整理一下使用策略模式来实现。
策略模式的类图如下:
那就依葫芦画瓢,首先定义一个发奖策略类:
public interface PrizeStrategy {
Object award(String param);
}
然后声明具体发奖策略类:
@Component("coupon")
public class CouponPrizeStrategy implements PrizeStrategy{
@Override
public Object award(String param) {
System.out.println("发红包了");
return "coupon";
}
}
@Component("gift")
public class GiftPrizeStrategy implements PrizeStrategy{
@Override
public Object award(String param) {
System.out.println("发实物");
return "实物";
}
}
@Component("hongBao")
public class HongBaoPrizeStrategy implements PrizeStrategy{
@Override
public Object award(String param) {
System.out.println("发红包了");
return "hongbao";
}
}
接下来创建上下文类:
@Component
public class PrizeContext {
@Autowired
private Map<String,PrizeStrategy> map;
public Object getPrize(String type){
return map.get(type).award("");
}
}
测试调用:
@RestController
public class PrizeController {
@Autowired
private PrizeContext prizeContext;
@GetMapping("/prize")
public Object prize(String award){
Object prize = prizeContext.getPrize(award);
System.out.println(prize);
return "bingo";
}
}
响应:
调试观察:
无需额外操作,即可正常注入map进行使用。