设计模式-策略模式

业务场景

项目需要对接支付系统,根据不同客户类型会有不同的支付方式,比如:支付宝、微信、银联、云闪付等等其他第三方支付平台,这个时候策略模式就大展身手了。
传统的if/else/switch 等等判断的写法太low了,代码糅合在一块,维护也不方便

核心

主要三个角色:
* 策略接口
* 策略实现
* 上下文

实现

  1. 策略接口
    IPayment
public interface IPayment {

    //支付方式
    void pay(String method);

}

  1. 策略实现类
    AliPay
public class AliPay implements IPayment {
    @Override
    public void pay(String method) {
        System.out.println("使用支付宝支付...");
    }
}

WechatPay

public class WechatPay implements IPayment {
    @Override
    public void pay(String method) {
        System.out.println("使用微信支付...");
    }
}

  1. 上下文
    Context
public class Context {

    private IPayment iPayment;

    public Context(IPayment iPayment) {
        this.iPayment = iPayment;
    }

    public void pay(String method) {
        iPayment.pay(method);
    }

}

测试

Test

public class Test {

    public static void main(String[] args) {

        //支付宝方式
        IPayment aliPay = new AliPay();
        aliPay.pay("使用支付宝支付");

        //微信方式
        IPayment wechatPay = new WechatPay();
        wechatPay.pay("使用微信支付");

    }

}

基于枚举的策略模式

Pay

public enum Pay {

    Wechat(){
        @Override
        public void pay(String method) {
            System.out.println("使用微信支付");
        }
    },
    AliPay(){
        @Override
        public void pay(String method) {
            System.out.println("使用支付宝支付");

        }
    }
    ;

    public abstract void pay(String method);


}

测试

 public static void main(String[] args) {
        //原策略使用方式
        strategy();

        //使用枚举策略改进 消除if-else
        enums("Wechat");
    }


    public static void strategy() {
        //支付宝方式
        IPayment aliPay = new AliPay();
        aliPay.pay("使用支付宝支付");

        //微信方式
        IPayment wechatPay = new WechatPay();
        wechatPay.pay("使用微信支付");
        System.out.println("==================");

    }


    public static void enums(String method) {
        Pay pay = Pay.valueOf(method);
        pay.pay(method);
    }

image

posted @ 2023-08-03 20:38  长情c  阅读(31)  评论(0)    收藏  举报