基于SpringBoot,用单个接口实现策略模式的选择(支付的简单案例)案例二:使用枚举的方式:

案例一用的是接口,在我的文章的第一篇中有;下面演示以下案例二的操作方式:

使用枚举的方式:实现策略模式的选择(支付的简单案例):

定义一个枚举类:

包含各种支付的示例:

并写一个执行支付的抽象方法paying(double amount);每个都枚举实例都重写上。
import lombok.Getter;
@Getter
public enum PayWays {
    QQ_PAY("qqpay"){
        public void paying(double amount) {
            System.out.println("使用QQ支付:"+amount+"元");
            // 实现QQ支付的具体逻辑
        }
    },
    ALI_PAY("alipay"){
        public void paying(double amount) {
            System.out.println("使用支付宝支:" + amount + "元");
            // 实现支付宝支付的具体逻辑
        }
    },
    WECHAT_PAY("wechatpay"){
        public void paying(double amount) {
            System.out.println("使用微信支付:" + amount + "元");
            // 实现微信支付的具体逻辑
        }
    },
    YUNFLASH_PAY("yunflashpay"){
        public void paying(double amount) {
            System.out.println("使用云闪付支付:"+amount+"元");
            // 实现云闪付支付的具体逻辑
        }
    },
    DIGITALRMB_PAY("digitalpay"){
        public void paying(double amount) {
            System.out.println("使用数字人民币支付:"+amount+"元");
            // 实现数字人民币支付的具体逻辑
        }
    },
    ;
    //构造方法,初始化属性值。
    PayWays(String payWay) {
        this.payWay = payWay;
    }
    //属性payWay。
    public final String payWay;
    //逻辑方法
    public static PayWays getEnum(String payWay){
        for (PayWays pay : PayWays.values()) {
            if (pay.payWay==payWay){
                return pay;
            }
        }
        return null;
    }
    //执行支付的抽象方法;每个都枚举实例都重写上。
    public abstract void paying(double amount);

}

测试:

@Test
    public void testEnumPay(){
        int amount=20;
        String payWay=PayConstant.ALI_PAY;

        try {
            PayWays payWays=PayWays.getEnum(payWay);
        if (payWays!=null){
            payWays.paying(amount);
        }
           else{ throw new  Exception();}
        }catch (Exception e){
            System.out.println("不支持的支付方式,请重新选择");
        }
    }

 测试结果:

使用支付宝支:20.0元

未知的支付测试:

测试结果:

不支持的支付方式,请重新选择

以上是本期的内容。 

改进:

改进地方主要是枚举类的getEum(double amout)的方法;用整型Int数字代替:

代码:

public enum PayWaysInt {
    QQ_PAY(0){
        public void paying(double amount) {
            System.out.println("使用QQ支付:"+amount+"元");
        }
    },
    ALI_PAY(1){
        public void paying(double amount) {
            System.out.println("使用支付宝支付:"+amount+"元");
        }
    },
    WECHAT_PAY(2){
        public void paying(double amount) {
            System.out.println("使用微信支付:"+amount+"元");
        }
    },
    YUNFLASH_PAY(3){
        public void paying(double amount) {
            System.out.println("使用云闪付支付:"+amount+"元");
        }
    },
    DIGITALRMB_PAY(4){
        public void paying(double amount) {
            System.out.println("使用数字人民币支付:"+amount+"元");
        }
    };
    private int payWay;
    PayWaysInt(int payWay) {
        this.payWay = payWay;
    }

    public static PayWaysInt getPay(int payNum){
        PayWaysInt[] waysInt = PayWaysInt.class.getEnumConstants();
        return waysInt[payNum];
    }

    public abstract void paying(double amount);
}

测试:

@Test
    public void testPayWaysInt(){
        int amount=10;
        int payNum=3;
        try {
            PayWaysInt pay = PayWaysInt.getPay(payNum);
                pay.paying(amount);
        } catch (Exception o) {
            if (o.getMessage().contains("out of bounds")){
                throw new OtherException(PayConstant.NOT_FOUNT);
            }
        }
    }

测试结果:

使用云闪付支付:10.0元

这里有五个支付方式,则int范围是0-4:如果整型赋值超过了4,会抛枚举索引数组越界的异常,所以在改测试方法中进行了异常捕捉:

测试:

测试通过。

  • 17
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值