CTO 写的代码,真是绝了
点击上方“方志朋”,选择“设为星标”
回复”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 写的代码,真是绝了相关推荐
- 转程序员,都去写一写前端代码吧
转自: http://www.oschina.net/news/36972/programmer-write-frond-end-code 你可以认为我是一个极端的人,就像有许多人专注于自己的领域而不 ...
- 实力坑队友! CTO 写出低级 Bug,致公司 70 GB 数据遭泄露!
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 大数据文摘转载自CSDN(ID:CSDNnews) 整理:苏宓 近日,据外媒报道,美国 ...
- CTO 写的低级 Bug 再致网站被黑,CEO 的号都被盗了!
整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 上周,美国开源社交网络服务平台 Gab ,因其 CTO 写的低级 Bug 受到黑客攻击,导致约 70GB 的数据被窃取. 可该公司 ...
- CTO 写低级 Bug,致公司 70 GB 数据遭泄露!
前有"程序员删库跑路",后有 CTO 在网站后台引入 Bug,导致公司 1.5 万账户信息外泄. 整理 | 苏宓 出品 | CSDN(ID:CSDNnews) 近日,据外媒报道,美 ...
- 阿里工程师年薪百万,写的代码到底咋样?
点击"技术领导力"关注∆ 每天早上8:30推送 来源| 淘系技术 作者|朱天富 导语:本文是由阿里技术专家,朱天富所写.介绍了阿里是如何提高代码质量的,读完此文你就会对大厂的代 ...
- 不要写完代码就束之高阁,适当地优化代码结构,能够为以后的开发带来许多方便,这《重构:改善既有代码的设计》就向你介绍了这方面的技巧,说得非常详细。...
"不要写完代码就束之高阁,适当地优化代码结构,能够为以后的开发带来许多方便,这<重构:改善既有代码的设计>就向你介绍了这方面的技巧,说得非常详细." "程序几 ...
- vim java 编程_你也用Vim写Java代码?
献给所有曾试图写Java而痛苦挣扎的Vimers, 请不要害怕, 我也是你们的一员 序 文章源起于segmentfault论坛中的一个问题, 由于回答的有点尽性, 便转为文章. 题主应该是个Vim初学 ...
- Python写的代码打包成.exe可执行文件
Python写的代码打包成.exe可执行文件 1. 安装pyinstaller 2. [在线生成icon](http://www.ico51.cn/) 3. 打包命令 pyinstaller -i x ...
- 多些时间能少写些代码(转自酷壳 – CoolShell.cn)
我在我的微博上说过这样一段话,我想在这里把我的这个观点阐述地更完整一些. @左耳朵耗子:聪明的程序员使用50%-70%的时间用来思考,尝试和权衡各种设计和实现,而用30% – 50%的时间是在忙碌着编 ...
最新文章
- mysql join查询
- argv[1] 路径问题
- 软件工程实践之词频统计
- 存储过程双层循环_mysql嵌套存储过程实现循环嵌套
- Java多线程之Callable、Future和FutureTask
- XGBoost 重要参数、方法、函数理解及调参思路(附例子)
- C++string容器-构造函数
- 工业以太网在工业领域的应用特点详解
- MFC 配置OpenCV在Picture控件上绘图
- nacos 服务日志_如何屏蔽Nacos日志输出?
- RPC和Message Passing比较
- php多图片打包下载
- 苹果手机咋用计算机,苹果手机怎么通过usb连接电脑上网
- BZOJ3509. [CodeChef] COUNTARI
- 简单好听的id_简单好听的微信id
- 医院预约挂号系统-系统结构
- Unity_ClickToShow_FadeInAndOut
- 深入理解connect by levelxxx
- abap视图字段限制_创建表维护视图(SE54)
- 平台程序微信平台开发应用的签名