设计模式之策略模式(strategy)
策略模式(strategy)
可以避免多if else的情况
举例
类图:
以在支付方式举例
订单类
public class Order {
private Integer uid;
private String orderId;
private Double amount;
public Order(Integer uid, String orderId, Double amount) {
this.uid = uid;
this.orderId = orderId;
this.amount = amount;
}
public void pay(String payType){
Payment payment = PayStrategy.get(payType);
payment.pay(uid,amount);
}
}
交易类型接口
public abstract class Payment {
public abstract String getName();
public abstract Double getAmount();
public void pay(Integer uid,Double amount){
if(getAmount() <= amount){
throw new RuntimeException("余额不足");
}
System.out.println(uid+" 交易成功,交易金额 : "+amount);
}
}
交易类型实现
public class AliPay extends Payment{
@Override
public String getName() {
return "AliPay";
}
@Override
public Double getAmount() {
return 100.0;
}
}
public class WeChatPay extends Payment {
@Override
public String getName() {
return "WeChatPay";
}
@Override
public Double getAmount() {
return 200.0;
}
}
策略接口
public class PayStrategy {
public static final String ALI_PAY = "alipay";
public static final String WECHAT_PAY = "wechatpay";
public static final String DEFAULT_PAY = ALI_PAY;
static Map<String,Payment> paymentMap = new HashMap<>();
static {
paymentMap.put(ALI_PAY,new AliPay());
paymentMap.put(WECHAT_PAY,new WeChatPay());
}
public static Payment get(String payType){
if(!paymentMap.containsKey(payType)){
return paymentMap.get(DEFAULT_PAY);
}
return paymentMap.get(payType);
}
}
main
public class Main {
public static void main(String[] args) {
Order order = new Order(1,"jyd1",190.0);
order.pay(PayStrategy.WECHAT_PAY);
}
}
结果结论
1 交易成功,交易金额 : 190.0
这里用过传入交易类型,获取交易的实体类,进行交易处理
符合开闭原则.如果不用策略模式,可能在大量交易类型时,会出现多个ifelse语句,也不利于扩展
不同之间的策略不一定平级,也可以相互集成
缺点:客户端需要知道有哪些策略,策略类相对多增加维护难度
应用
Comparator 比较器
spring InstantiationStategy
设计模式之策略模式(strategy)
https://www.blaaair.com/archives/she-ji-mo-shi-zhi-ce-lve-mo-shi-strategy