设计模式之策略模式(strategy)

策略模式(strategy)

可以避免多if else的情况

举例

类图:

20200422132300975_16927

以在支付方式举例

订单类

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
作者
Glo6f
发布于
2022年03月31日
许可协议