策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
其主要目的是通过定义相似的算法,替换if else 语句写法,并且可以随时相互替换。
1.注入List方式实现
//支付父接口
public interface IPay {
boolean support(String type);
void payMoney();
}
//微信支付
@Component
public class PayWX implements IPay {
@Override
public boolean support(String type) {
return "wxpay".equalsIgnoreCase(type);
}
@Override
public void payMoney() {
System.out.println("微信支付成功");
}
}
//支付宝支付
@Component
public class PayZFB implements IPay {
@Override
public boolean support(String type) {
return "zfbpay".equalsIgnoreCase(type);
}
@Override
public void payMoney() {
System.out.println("支付宝支付成功");
}
}
//调用
@Autowired
private List<IPay> payList;
@RequestMapping(value = "/test/pay3", method = {RequestMethod.GET})
public String pay3(String type) {
for (IPay pay:payList){
if(pay.support(type)){
pay.payMoney();
}
}
return "ok";
}
2.注入Map方式实现
//支付父接口
public interface Pay {
void payMoney();
}
import org.springframework.stereotype.Component;
//微信支付
@Component("WXPay")
public class WXPay implements Pay{
@Override
public void payMoney() {
System.out.println("微信支付成功");
}
}
import org.springframework.stereotype.Component;
//支付宝支付
@Component("ZFBPay")
public class ZFBPay implements Pay{
@Override
public void payMoney() {
System.out.println("支付宝支付成功");
}
}
//调用支付
@RestController
@RequestMapping("/api")
public class TestRedisController {
@Autowired
private Map<String, Pay> payMap;
@RequestMapping(value = "/test/pay", method = {RequestMethod.GET})
public String pay(String type) {
payMap.get(type).payMoney();
return "ok";
}
}
3.实现InitializingBean接口(简单伪代码,建议前两种)
//实现InitializingBean接口,重写afterPropertiesSet方法
@Component
public class ZFBPayTwo implements PayTwo, InitializingBean {
@Autowired
private PayFactory payFactory;
@Override
public void payMoney() {
System.out.println("ZFBPayTwo成功");
}
@Override
public void afterPropertiesSet() throws Exception {
payFactory.register("ZFBPayTwo",this);
}
}
@Component
public class PayFactory {
private Map<String,PayTwo> services = new ConcurrentHashMap<>();
public PayTwo getPayTwo(String type){
return services.get(type);
}
public void register(String type,PayTwo payTwo){
services.put(type,payTwo);
}
}