重构的唯一目的是:用较小的工作量,创造更大的价值。
本文主要内容:通过一个简单的代码示例,利用表驱动的编程方法、策略模式和工厂模式等对 if-else 语句进行改进。
先看一个具体的例子:设计一个程序,通过不同的渠道(移动,联通…)发送消息。
用 if-else 实现
在 MsgServiceIml 类实现了 MsgService 消息服务接口,重写发送消息的方法 send。目前使用「中国移动」和「联通」两种渠道发消息,下面的代码所示:
public class MsgServiceImpl implements MsgService() {
/**
* 发送消息
* @param channelType 渠道类型
* @param content 消息内容
*/
@Override
public void send(String channelType, String content) {
if ("中国移动".equals(channelType)) {
System.out.println("-----使用中国移动发消息-----");
return;
} else if ("中国联通".equals(channelType)) {
System.out.println("-----使用中国联通发消息-----");
return;
} else {
throw new RuntimeException("不支持的渠道类型")
}
}
}
上面的方法,使用 if-else 语句来根据渠道的类型来选用发送消息的方式,看起来很合理,但是实际上扩展性不强,每一次增加一种新的渠道的时候,需要改写 send 方法,向其中增加代码,违反了「开闭原则」(对扩展开放,对修改关闭)。
表驱动
表驱动:一种编程方法,将处理各种条件的方法,装入映射表,根据具体情况选用不同的方法来处理。
下面使用映射表的思想,将具体处理各种情况的方法放入映射表中。
这样,当需要新增渠道的时候,新写一类继承 Action 类,同时装入映射表即可。
public enum TableMappingEnum {
/* 策略1*/
ACTION_ONE,
/* 策略2*/
ACTION_TWO,