定义:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。
分析下定义,策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有共性,而它们的共性就体现在策略接口的行为上,另外为了达到最后一句话的目的,也就是说让算法独立于使用它的客户而独立变化,我们需要让客户端依赖于策略接口。
策略模式的使用场景:
1.针对同一类型问题的多种处理方式,仅仅是具体行为有差别时,例如支付,支付方式可以有多种,但只需提供一个对外接口即可;
2.需要安全地封装多种同一类型的操作时;
3.出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时。
抽象策略类
/**
*统一下单接口
*/
public interface IPay {
void pay();
}
###具体策略类
@Service("AppPay")
public class AppIPay implements IPay {
@Override
public void pay() {
System.out.println("AppPay");
}
}
@Service("QrCodePay")
public class QrCodeIPay implements IPay {
@Override
public void pay() {
System.out.println("QrCodePay");
}
}
//新增其他支付方式只需实现IPay
//将策略实现类注入到map
@Component
public class PayFactory {
private Map <String, IPay> factoryMap = new ConcurrentHashMap <>();
/**
* @Autowired 修饰构造函数,Spring会将实现了IPay接口的Bean,默认首字母小写,注入到map中
* @param map
*/
@Autowired
public PayFactory(Map <String, IPay> map) {
this.factoryMap.clear();
map.forEach((k, v) -> this.factoryMap.put(k, v));
}
public IPay getPay(String type) {
return factoryMap.get(type);
}
}
public enum TopupEnum {
QrCodePay("0302", "QrCodePay"),
WxH5Pay("0502", "WxH5Pay"),
WxJsPay("0602", "JsPay"),
AliJsPay("0702", "JsPay"),
WxAppPay("0802", "AppPay"),
AliAppPay("0902", "AppPay");
/**
*支付方式
*/
private String topupType;
/**
*策略实现类名字 @Service("AppPay")
*/
private String value;
public static TopupEnum value(String topupType) {
for (TopupEnum topupEnum : TopupEnum.values()) {
if (topupEnum.getTopupType().equalsIgnoreCase(topupType)) {
return topupEnum;
}
}
return null;
}
}
###提供对外下单接口
//根据支付方式调用对应的实现方法 每种支付方式对应的值自己定义
public void test() {
IPay iPay = payFactory.getPay(TopupEnum.value("0802").getValue());
//输出AppPay
pay.pay();
}