现在做了一个逆向的需求,退款类型分为“退票,退保,退急速,退多收”,
然后根据不同的退款类型需要做不同的操作。正常写法是定义一个枚举类,然后用多个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);
}
}