策略模式是将定义的算法家族,分别封装起来,让它们可以互相替换,从而让算法的变化不会影响到使用算法的用户。
策略模式的本质就是面向对象继承和多态机制,满足同一方法在不同场景下不同的实现。解决多if else 的复杂情况。
以淘宝购物付款为例,有通过微信支付、支付宝支付、银联支付等,并且每种支付的实现方式都不同。
public interface IPay {
/**
* 支付
*/
void pay();
}
public enum PayTypeEnum {
WE_CHAT_PAY("weChat", "微信支付"),
ALI_PAY("aliPay", "支付宝支付"),
UNION_PAY("unionPay", "银联支付");
private String code;
private String name;
PayTypeEnum(String code, String name) {
this.code = code;
this.name = name;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
}
public class WeChatPay implements IPay {
@Override
public void pay() {
System.out.println("微信支付");
}
}
public class AliPay implements IPay{
@Override
public void pay() {
System.out.println("支付宝支付");
}
}
public class UnionPay implements IPay {
@Override
public void pay() {
System.out.println("银联支付");
}
}
public class PayStrategy {
private static Map<String, IPay> payMap = new HashMap<>(4);
private PayStrategy() {
}
static {
payMap.put(PayTypeEnum.WE_CHAT_PAY.getCode(), new WeChatPay());
payMap.put(PayTypeEnum.ALI_PAY.getCode(), new AliPay());
payMap.put(PayTypeEnum.UNION_PAY.getCode(), new UnionPay());
}
public static IPay getInstance(String type) {
if (payMap.containsKey(type)) {
return payMap.get(type);
}
throw new RuntimeException("此支付方式正在开发ing");
}
}
public class TestStrategy {
public static void main(String[] args) {
PayStrategy.getInstance("weChat").pay();
PayStrategy.getInstance("aliPay").pay();
PayStrategy.getInstance("unionPay").pay();
}
}
/*
微信支付
支付宝支付
银联支付
*/
在Spring中,Spring帮我们管理了Bean的创建和销毁,策略如何使用呢?
利用Spring的@Qualifier("")注解
public interface IPay {
/**
* 支付
*/
void pay();
}
@Service
@Qualifier("weChat")
public class WeChatPay implements IPay {
@Override
public void pay() {
System.out.println("微信支付");
}
}
@Service
@Qualifier("aliPay")
public class AliPay implements IPay{
@Override
public void pay() {
System.out.println("支付宝支付");
}
}
@Service
@Qualifier("unionPay")
public class UnionPay implements IPay {
@Override
public void pay() {
System.out.println("银联支付");
}
}
@Service
public class PayStrategySpring {
@Autowired
private Map<String, IPay> payMap = new HashMap<>(4);
public IPay getInstance(String type) {
if (payMap.containsKey(type)) {
return payMap.get(type);
}
throw new RuntimeException("功能正在开发ing");
}
}
@RestController
public class PayController {
@Autowired
private PayStrategySpring payStrategySpring;
@GetMapping("/test")
public void test(@RequestParam String type) {
payStrategySpring.getInstance(type).pay();
}
}
浏览器输入http://localhost:8089/test?type=aliPay,即可自动执行想要的实现类。
原文:https://www.cnblogs.com/ns-study/p/14623315.html