策略模式+工厂模式+模板模式混合使用

现实中存在这种业务场景,通过交易号执行不同的业务代码逻辑,就算把业务方法封装成不同的方法也会出现很多的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);
}

 


版权声明:本文为qq_36154832原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。