CTO 写的代码,真是绝了
★★★建议星标我们★★★
Java进阶架构师★“星标”!这样才不会错过每日进阶架构文章呀 。
文章插图
文章插图
2020年Java原创面试题库连载中
【000期】Java最全面试题库思维导图
【020期】JavaSE系列面试题汇总(共18篇)
【028期】JavaWeb系列面试题汇总(共10篇)
【042期】JavaEE系列面试题汇总(共13篇)
【049期】数据库系列面试题汇总(共6篇)
【053期】中间件系列面试题汇总(共3篇)
【065期】数据结构与算法面试题汇总(共11篇)
【076期】分布式面试题汇总(共10篇)
【077期】综合面试题系列(一)
【078期】综合面试题系列(二)
【079期】综合面试题系列(三)
【080期】综合面试题系列(四)
【081期】综合面试题系列(五)
【082期】综合面试题系列(六)
【083期】综合面试题系列(七)
【084期】综合面试题系列(八)
【085期】综合面试题系列(九)
【086期】综合面试题系列(十)
【087期】综合面试题系列(十一)
【088期】综合面试题系列(十二)
【089期】综合面试题系列(十三)
更多内容 , 点击上面蓝字查看
文章插图
作者:聚IT来源:touyatoutiao.com/i6847406631983153672
【CTO 写的代码,真是绝了】场景:当我们接收到一些数据需要对其进行处理时 , 由于它们来自于不同的渠道(如:腾讯 , 头条) , 不同渠道所需的处理方式不同 , 下面我们写一个简单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 ;}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抽象类 , 并在枚举类中新增的枚举 , 而不需要改动到原先的任何代码 。 这符合了开发封闭原则 。
- 文案|「热点传递」为什么别人卖点写的“勾人”?
- 吉林大学TARS-GO战队视觉代码
- TOP8无代码平台:2020年,这些机器学习平台不容错过
- 蓝鲸专访|水滴CTO邱慧:基于业务场景做技术创新,用户需求可分析并唤醒
- 十分钟教会你使用Python操作excel,内附步骤和代码
- 低代码的器学习工具
- C++核心准则?:标准库array或vector好于C数组
- 你只写了两行代码,为什么要花两天时间?
- IntelliJ IDEA 如何设置自动下载源代码和文档
- 新来的实习生竟然偷偷在代码里“下毒”......