点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试文章

作者:聚IT

来源:http://39sd.cn/BD828

场景:当我们接收到一些数据需要对其进行处理时,由于它们来自于不同的渠道(如:腾讯,头条),不同渠道所需的处理方式不同,下面我们写一个简单Demo来实现该的场景。

解决思路

1、首先构建一个 GeneralChannelRule 基础规则抽象类,定义一个抽象方法process(),不同的渠道都需要实现该抽象方法。

public abstract class GeneralChannelRule {public abstract void process();
}

2、编写一个腾讯的规则类,定义具体对于腾讯渠道数据的处理逻辑

public class TencentChannelRule extends GeneralChannelRule@Overridepublic void process() {// Tencent处理逻辑}
}

3、编写一个头条的规则类,定义具体对于头条数据的处理逻辑

public class TouTiaoChannelRule extends GeneralChannelRule@Overridepublic void process() {// TouTiao处理逻辑}
}

4、建立一个简单的枚举类

public enum ChannelRuleEnum {/*** 头条*/TOUTIAO("TOUTIAO"),/*** 腾讯*/TENCENT("TENCENT"),;....
}

5、使用规则对数据进行处理。

public static void main(String[] args) {//这里我们模拟接收到的数据,其渠道为为TOUTIAO,来自头条的数据String sign = "TOUTIAO";GeneralChannelRule rule;//根据对应渠道获取对应的具体规则实现类if (ChannelRuleEnum.TENCENT.code.equals(sign)) {rule = new TencentChannelRule();} else if (ChannelRuleEnum.TOUTIAO.code.equals(sign)) {rule = new TouTiaoChannelRule();} else {//匹配不到}//执行rule.process();}

解析:如果通过上面的方式,则存在则两个缺点。

当我们需要新增新的渠道的时候,需要对main方法中的逻辑进行修改调整。这违背了设计模式中的开放封闭规则。开放封闭原bai则的核心的思想是软件实体是可扩du展,而不可zhi修改的。

也就是说,对扩展是开dao放的,而对修改是封闭的

新增渠道后,修改代码会产生大量的if else,不太优雅。为了解决以上的两个问题,我们可以借助枚举类来巧妙优化。

新的思路

1、下面我们调整一下枚举类,增加一个GeneralChannelRule属性,并且给对应渠道构建对应的GeneralChannelRule实现类,新增一个match() 匹配方法。

public enum ChannelRuleEnum {/*** 头条*/TOUTIAO("TOUTIAO",new TouTiaoChannelRule()),/*** 腾讯*/TENCENT("TENCENT",new TencentChannelRule()),;public String name;public GeneralChannelRule channel;ChannelRuleEnum(String name, GeneralChannelRule channel) {this.name = name;this.channel = channel;}//匹配public static ChannelRuleEnum match(String name){ChannelRuleEnum[] values = ChannelRuleEnum.values();for (ChannelRuleEnum value : values) {if(value.name.equals(name)){return value;}}return null;}public String getName() {return name;}public GeneralChannelRule getChannel() {return channel;}
}

2、改写程序

public static void main(String[] args) {String sign = "TOUTIAO";ChannelRuleEnum channelRule = ChannelRuleEnum.match(sign);GeneralChannelRule rule = channelRule.channel;rule.process(sign);}

解析:通过使用枚举类,在枚举中将 key 与 规则具体实现进行绑定。通过改变:

可以减少if -else使得代码更加优雅 如果需要新增渠道,我们只需要在编写具体规则实现类并继承GeneralChannelRule抽象类,并在枚举类中新增的枚举,而不需要改动到原先的任何代码。这符合了开发封闭原则。

最后

以上是通过枚举来巧妙干掉if-else的方案,对于减少 if-else 还有很多有趣的解决方案(如:状态设计模式等),感兴趣的朋友去查阅相关的资料。

热门内容:Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!Java8 快速实现List转map 、分组、过滤等操作
SpringBoot 三招组合拳,手把手教你打出优雅的后端接口不要再自己封装各种Util工具类了,这款神仙级框架你值得拥有!实战:上亿数据如何秒查真牛逼!我司用了7年的分布式锁方案...最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ

CTO 写的代码,真是绝了相关推荐

  1. 转程序员,都去写一写前端代码吧

    转自: http://www.oschina.net/news/36972/programmer-write-frond-end-code 你可以认为我是一个极端的人,就像有许多人专注于自己的领域而不 ...

  2. 实力坑队友! CTO 写出低级 Bug,致公司 70 GB 数据遭泄露!

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 大数据文摘转载自CSDN(ID:CSDNnews) 整理:苏宓 近日,据外媒报道,美国 ...

  3. CTO 写的低级 Bug 再致网站被黑,CEO 的号都被盗了!

    ‍‍ 整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 上周,美国开源社交网络服务平台 Gab ,因其 CTO 写的低级 Bug 受到黑客攻击,导致约 70GB 的数据被窃取. 可该公司 ...

  4. CTO 写低级 Bug,致公司 70 GB 数据遭泄露!

    前有"程序员删库跑路",后有 CTO 在网站后台引入 Bug,导致公司 1.5 万账户信息外泄. 整理 | 苏宓 出品 | CSDN(ID:CSDNnews) 近日,据外媒报道,美 ...

  5. 阿里工程师年薪百万,写的代码到底咋样?

    点击"技术领导力"关注∆  每天早上8:30推送 来源| 淘系技术  作者|朱天富 导语:本文是由阿里技术专家,朱天富所写.介绍了阿里是如何提高代码质量的,读完此文你就会对大厂的代 ...

  6. 不要写完代码就束之高阁,适当地优化代码结构,能够为以后的开发带来许多方便,这《重构:改善既有代码的设计》就向你介绍了这方面的技巧,说得非常详细。...

    "不要写完代码就束之高阁,适当地优化代码结构,能够为以后的开发带来许多方便,这<重构:改善既有代码的设计>就向你介绍了这方面的技巧,说得非常详细." "程序几 ...

  7. vim java 编程_你也用Vim写Java代码?

    献给所有曾试图写Java而痛苦挣扎的Vimers, 请不要害怕, 我也是你们的一员 序 文章源起于segmentfault论坛中的一个问题, 由于回答的有点尽性, 便转为文章. 题主应该是个Vim初学 ...

  8. Python写的代码打包成.exe可执行文件

    Python写的代码打包成.exe可执行文件 1. 安装pyinstaller 2. [在线生成icon](http://www.ico51.cn/) 3. 打包命令 pyinstaller -i x ...

  9. 多些时间能少写些代码(转自酷壳 – CoolShell.cn)

    我在我的微博上说过这样一段话,我想在这里把我的这个观点阐述地更完整一些. @左耳朵耗子:聪明的程序员使用50%-70%的时间用来思考,尝试和权衡各种设计和实现,而用30% – 50%的时间是在忙碌着编 ...

最新文章

  1. mysql join查询
  2. argv[1] 路径问题
  3. 软件工程实践之词频统计
  4. 存储过程双层循环_mysql嵌套存储过程实现循环嵌套
  5. Java多线程之Callable、Future和FutureTask
  6. XGBoost 重要参数、方法、函数理解及调参思路(附例子)
  7. C++string容器-构造函数
  8. 工业以太网在工业领域的应用特点详解
  9. MFC 配置OpenCV在Picture控件上绘图
  10. nacos 服务日志_如何屏蔽Nacos日志输出?
  11. RPC和Message Passing比较
  12. php多图片打包下载
  13. 苹果手机咋用计算机,苹果手机怎么通过usb连接电脑上网
  14. BZOJ3509. [CodeChef] COUNTARI
  15. 简单好听的id_简单好听的微信id
  16. 医院预约挂号系统-系统结构
  17. Unity_ClickToShow_FadeInAndOut
  18. 深入理解connect by levelxxx
  19. abap视图字段限制_创建表维护视图(SE54)
  20. 平台程序微信平台开发应用的签名

热门文章

  1. 学习进度条(第一周)
  2. Uva 11400 - Lighting System Design (DP)
  3. SpringCloud的服务网关zuul
  4. Hdu_2063 过山车 -最大匹配(邻接表版)
  5. (转)Unity中武器与人物的碰撞检测
  6. java中使用队列:java.util.Queue
  7. ibatis源码浅析- 初探
  8. (转)uml 静态视图依赖
  9. MOG2 成员函数参数设定
  10. 【Codeforces】1015B Obtaining the String(字符串 交换)