基于Spring的策略模式

163 阅读1分钟

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

其主要目的是通过定义相似的算法,替换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);
    }

}