策略模式项目实践说明

现在做了一个逆向的需求,退款类型分为“退票,退保,退急速,退多收”,
然后根据不同的退款类型需要做不同的操作。正常写法是定义一个枚举类,然后用多个if else判断就可以了。
不过我试着用策略模式实现。策略模式的类图是:

这里写图片描述
上面类图和标准策略模式有一点差异是context中声明的属性不是接口,而是map,map初始化是在spring的xml中util节点。map的key是refundType,value是RefundService。
策略模式的好处是:
1)消除了代码中if else
2)代码隔离性变得更好,新增新的退款条件也好扩展

策略模式的坏处是:
1)增加了多个类,比如我在项目中就多了6个类


看了书上介绍还一种枚举策略,大致思路是在枚举中定义个抽象方法,然后在枚举中实现这个抽象方法。(我觉得这个对我这个可能不太适用,但是由于第一次见这种写法,所以将我之前代码改造成枚举策略给大家看看。

package com.evan.javaConcurrentTwo;

public enum RefundStrategyEnum {

    TICKET_REFUND_ENUM("1") {
        public void handleRefund(Object refund) {
            System.out.println("handle ticket refund business");
        }
    },

    INSURANCE_REFUND_ENUM("2") {
        public void handleRefund(Object refund) {
            System.out.println("handle insurance refund business");
        }
    },

    SPEED_REFUND_ENUM("3") {
        public void handleRefund(Object refund) {
            System.out.println("handle speed refund business");
        }
    },

    OVER_CHARGED_REFUND_ENUM("4") {
        public void handleRefund(Object refund) {
            System.out.println("handle over charged refund business");
        }
    };

    private String refundType;

    public String getRefundType() {
        return refundType;
    }

    RefundStrategyEnum(String refundType) {
        this.refundType = refundType;
    }

    public abstract void handleRefund(Object refund);

    public static RefundStrategyEnum getRefundStrategyEnumByRefundType(String refundType){
        for(RefundStrategyEnum refundStrategyEnum:RefundStrategyEnum.values()){
            if(refundStrategyEnum.getRefundType().equals(refundType)){
                return refundStrategyEnum;
            }
        }
        return null;
    }
}

使用方法和策略模式的context类用法一样。

package com.evan.javaConcurrentTwo;

public class ClientService {
    public static void main(String[] args) {
        String refundType = "4";
        Object refund = new Object();
        RefundStrategyEnum.getRefundStrategyEnumByRefundType(refundType).handleRefund(refund);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值