Java策略模式
- Java策略模式非常多,这里举例的是我在工作中最常见且使用的一种
众所周知,策略模式是为了解决频繁的if-else嵌套判断的。
例如:现在需要同时处理三种支付方式,微信支付、支付宝支付、其他支付。
1. 首先先定义一个接口里面定义一个方法为支付pay(),在为每种支付方式定义一个返回该类型的方法getType()
public interface PayStrategy {
// 支付方法
void pay(JSONObject jsonObject);
// 获取每种支付所对应的类型
Integer getType();
}
2. 让你所需要的具体实现类都去实现该接口(WxPayImpl、ZfxPayImpl、OtherPayImpl)
微信支付实现类
@Component
public class WxPayImpl implements PayStrategy {
@Override
public void pay(JSONObject jsonObject) {
System.out.println("微信支付 = " + jsonObject);
}
/**
* 微信支付类型为2
*/
@Override
public Integer getType() {
return 2;
}
}
支付宝支付实现类
@Component
public class ZfxPayImpl implements PayStrategy {
@Override
public void pay(JSONObject jsonObject) {
System.out.println("支付宝支付 = " + jsonObject);
}
@Override
public Integer getType() {
return 3;
}
}
其他支付实现类
@Component
public class OtherPayImpl implements PayStrategy {
@Override
public void pay(JSONObject jsonObject) {
System.out.println("其他支付 = " + jsonObject);
}
@Override
public Integer getType() {
return 1;
}
}
3. 定义一个策略工厂(策略重要逻辑)
具体解释在注释中
@Component
public class StrategyFactory {
/**
* 将所有支付注入到一个list中
*/
private final List<PayStrategy> payStrategyList;
/**
* 用Map装类型和对应的service Map<支付类型,对应service>
*/
private Map<Integer, PayStrategy> payStrategyMap = new HashMap<>();
/**
* 通过构造器注入
*/
public StrategyFactory(List<PayStrategy> payStrategyList) {
this.payStrategyList = payStrategyList;
}
/**
* @PostConstruct注解方法时,该方法会在最先进行初始化:这里是将每种支付方式对应的类型和service放进Map中
*/
@PostConstruct
public void init() {
payStrategyMap = payStrategyList.stream().collect(Collectors.toMap(PayStrategy::getType, o -> o));
}
/**
* 该方法会根据所传类型从Map中找对对应的service
*/
public PayStrategy getService(Integer type) {
return payStrategyMap.get(type);
}
}
到这里,整个策略模式就已经完成了,
4. 测试
调用策略工厂中的getService方法。
@GetMapping("/test-strategy")
public Result<JSONObject> testStrategy(Integer type) {
PayStrategy service = strategyFactory.getService(type);
JSONObject jsonObject = new JSONObject();
service.pay(jsonObject);
return Result.success();
}
- 其他支付(type=1)
控制台
2、支付宝支付(type= 3)
控制台
3. 微信支付(type=2)
控制台