现实中存在这种业务场景,通过交易号执行不同的业务代码逻辑,就算把业务方法封装成不同的方法也会出现很多的if-else,代码看起来很臃肿。如果需要添加新的交易还需要添加新的il-else。
String transNo = "30012400";
if (transNo == "30012400") {
new TransNo30012400().function();
} else if (transNo == "30012401") {
new TransNo30012401().function();
} else if (transNo == "30012402") {
new TransNo30012402().function();
} else if (transNo == "30012403") {
new TransNo30012403().function();
} else if (transNo == "30012404") {
new TransNo30012404().function();
} else if (transNo == "30012405") {
new TransNo30012405().function();
} else if (transNo == "30012406") {
new TransNo30012406().function();
}
新建AbstractHandler类,编写所有可能执行方法的抽象方法
public abstract class AbstractHandler implements InitializingBean {
/**
* 交易处理方法-返回类型为String
*
* @param name
*/
public String processingTypeString(String transNo) {
throw new UnsupportedOperationException();
}
/**
* 交易处理方法-返回类型为BigDecimal
*
* @param name
*/
public BigDecimal processingTypeBigDecimal(String transNo) {
throw new UnsupportedOperationException();
}
}
新建交易工厂,用于存储以后的交易类
public class TransFactory {
private static Map<String, AbstractHandler> transMap = Maps.newHashMap();
public static AbstractHandler getInvokHandler(String transNo) {
return transMap.get(transNo);
}
public static void register(String transNo, AbstractHandler handler) {
if (StringUtils.isEmpty(transNo) || null == handler) {
return;
}
transMap.put(transNo, handler);
}
}
新建两个交易类,必须添加@Component,交个Spring管理,AbstractHandler实现了InitializingBean接口,这个方法afterPropertiesSet会在类加载的时候执行
@Component
public class TransNo30012405 extends AbstractHandler {
@Override
public void afterPropertiesSet() throws Exception {
TransFactory.register("30012405", this);
}
public String processingTypeString(String transNo) {
// TODO业务逻辑
return "交易成功";
}
}
@Component
public class TransNo30012406 extends AbstractHandler {
@Override
public void afterPropertiesSet() throws Exception {
TransFactory.register("30012406", this);
}
public BigDecimal processingTypeBigDecimal(String transNo) {
// TODO业务逻辑
return BigDecimal.ONE;
}
}
测试用例
@Test
public void functionDemo() {
String transNo = "30012405";
AbstractHandler invokHandler = TransFactory.getInvokHandler(transNo);
String str = invokHandler.processingTypeString(transNo);
System.out.println(str);
transNo = "30012406";
AbstractHandler invokHandler1 = TransFactory.getInvokHandler(transNo);
BigDecimal bigDecimal = invokHandler1.processingTypeBigDecimal(transNo);
System.out.println(bigDecimal);
}