我有N种方法消除 if-else,而你却无可奈何(第二篇:表驱动编程方法)

重构的唯一目的是:用较小的工作量,创造更大的价值。

本文主要内容:通过一个简单的代码示例,利用表驱动的编程方法、策略模式和工厂模式等对 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,
   
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值