浅谈Java的开放封闭原则
写在前面
最近, 接手了一个新业务,系统的架构可圈可点。但有些地方让人望而生畏,有些代码臃肿难以维护,让人不敢恭维。于是,结合了Java的开放封闭原则,对其中一部分代码进行了重构优化。
先来看下以前系统的老代码
ShareChannelManager.java
public ResultDO<String> shareChannel(int shareCode) {
if(ShareCodeUtil.share2A(shareCode)) {
// TODO, 分享到A渠道的业务逻辑代码
}
if(ShareCodeUtil.share2B(shareCode)) {
// TODO, 分享到B渠道的业务逻辑代码
}
...渠道n...
}
shareChannel这个方法承载了分享渠道的主要链路逻辑。分享到各个渠道的代码都写在了一个类的方法里面, 显得很臃肿, 不好维护。每次添加分享的渠道,都得修改此重量级的方法。稍微手抖撸错了, 会影响到其它渠道分享。同时也违背了Java的开放封闭原则。
介绍下Java的开放封闭原则
Java开放封闭原则, 咋一看给人一种矛盾的feel。开放了怎么还封闭呢?不要从表面上去理解。从两个维度去思考, **开放** & ***封闭**。Java的开放原则是指设计的架构具备良好的拓展性;而关闭原则是说系统的架构主链路不能随着业务迭代而大改, 即便是动辄全身,也只能说明系统的架构有问题。每个系统都必须经历一个从0到1的过程, 随着业务的发展,系统也可能一成不变。如何让系统的架构前瞻性、及拓展性,都是我们在日常开发中必须思考的技术点。
总之,Java的开放封闭原则有两个特征。
- 对于扩展是开放的
- 对于更改是封闭的
基于上述说的设计原则, 如何优化分上述提到的问题
思路是将多个分享渠道组成链式调用。将分享动作抽象出来,分发到各个渠道去实现。
定义分享渠道链
public class ShareChannelChain {
private final Logger LOG = LoggerFactory.getLogger(this.getClass());
/**
* 分享渠道链
*/
private List<ShareChannel> shareChannels;
public ResultDO<String> share(int shareCode) {
for (ShareChannel s : shareChannels) {
ResultDO<String> r = s.share(shareCode);
}
}
定义分享渠道父类
public interface ShareChannel {
public ResultDO<String> share(int shareCod);
}
A渠道分享
public class AChannel implements ShareChannel {
@Override
public ResultDO<String> share(int shareCode) {
// TODO 分享A渠道逻辑
}
}
B渠道分享
public class BChannel implements ShareChannel {
@Override
public ResultDO<String> share(int shareCode) {
// TODO 分享B渠道逻辑
}
}
将AChannel 和 BChannel 组装成一条调用链 ShareChannelChain。
<bean id="AChannel" class="com.test.AChannel">
</bean>
<bean id="BChannel" class="com.test.BChannel">
</bean>
<bean id="shareChannelChain" class="com.test.ShareChannelChain">
<property name="shareChannels">
<list>
<ref local="AChannel"/>
<ref local="BChannel"/>
</list>
</property>
</bean>
渠道分享主要接口
ShareChannelManager.java
public ResultDO<String> shareChannel(int shareCode) {
ShareChannelChain.share(shareCode);
}
最后来回顾下,看看优化之后架构带来的好处
假设有新的渠道分享业务需求,CChannel, 想想我们要改动的点。这次不必改动ShareChannelManager核心类逻辑了。只需要拓展一个CChannel,实现ShareChannel接口share方法,再配置到xml即可。这种改动点风险是可以控制的,不动到核心类逻辑。
写在最后
我的新博客
CSDN博客经常打不开, 老博客继续维护一段时间吧~~
浅谈Java的开放封闭原则的更多相关文章
- Observer观察者模式与OCP开放-封闭原则
目录 场景引入 在联网坦克项目中使用观察者模式 总结 在学习Observer观察者模式时发现它符合敏捷开发中的OCP开放-封闭原则, 本文通过一个场景从差的设计开始, 逐步向Observer模式迈进, ...
- 开放封闭原则(Open Closed Principle)
在面向对象的设计中有很多流行的思想,比如说 "所有的成员变量都应该设置为私有(Private)","要避免使用全局变量(Global Variables)",& ...
- 浅谈Java线程安全
浅谈Java线程安全 - - 2019-04-25 17:37:28 线程安全 Java中的线程安全 按照线程安全的安全程序由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类 ...
- 浅谈Java面向对象思想
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...
- 开放-封闭原则(OCP)
怎样的升级才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢?开放-封闭原则(The Open-Closed Principle, OCP)为我们提供了指引.软件 ...
- 北风设计模式课程---开放封闭原则(Open Closed Principle)
北风设计模式课程---开放封闭原则(Open Closed Principle) 一.总结 一句话总结: 抽象是开放封闭原则的关键. 1."所有的成员变量都应该设置为私有(Private)& ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Java中的对象和引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
随机推荐
- swift 2.0 与 OC 相比较,标签栏和导航栏书写的差别
下面是swift书写的时候的两个方法,其实这里不是教大家怎么样写的这个问题,我是想通过这两个不同语言的进行的一个比较,向大家找他们之间“想法”上的一些相同点,这样子我们学习swift的时候,就可以更加 ...
- 【Java基础】线程和并发机制
前言 在Java中,线程是一个很关键的名词,也是很高频使用的一种资源.那么它的概念是什么呢,是如何定义的,用法又有哪些呢?为何说Android里只有一个主线程呢,什么是工作线程呢.线程又存在并发,并发 ...
- 【录教程必备】推荐几款屏幕录制工具(可录制GIF)
我们经常会遇到一些场景,需要你向别人展示一些操作或是效果——例如告诉别人某某软件的配置步骤啊.刚设计出来网站的动画效果怎么样啊.某某电影里面的一个镜头多么经典啊.打得大快人心的NBA绝杀瞬间是怎么回事 ...
- SQL基础笔记
Codecademy中Learn SQL, SQL: Table Transformaton和SQL: Analyzing Business Metrics三门课程的笔记,以及补充的附加笔记. Cod ...
- devexpress实现单元格根据条件显示不同的样式(颜色、字体、对齐方式,大小等)
1.devexpress控件库之所以被大家所喜爱,是因为它将许多常用的东西都封装成了属性.可以通过一些简单的配置,将以前某些需要大篇幅代码才可实现的效果展示出来.这里是一个实现了将[第二列数据在表格0 ...
- Java集合框架之三:HashMap源码解析
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! HashMap在我们的工作中应用的非常广泛,在工作面试中也经常会被问到,对于这样一个重要的集合模型我们有必要弄清楚它的使用方法和它底层的实 ...
- 【前端】:jQuery下
前言: 接上一篇博客: [前端]:jQuery上 一.jQuery属性操作 ① attr(设置或返回自定义属性值) input.select.textarea框中的内容, 可以通过attr来获取,但是 ...
- Javascript匿名函数
单独的匿名函数无法运行,就算能运行,也无法调用.解决办法如下: 法1. //把匿名函数赋值给变量 var box=function(){ return "Lee"; }; aler ...
- 初识html5——试试博文编辑器
1.html5简介 HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTML5 仍处 ...
- Html5 基础----列表详述
html5列表 标签 列表分为: 有序列表/无序列表/自定义列表,用的最多的为无序列表和自定义列表 1.有序列表(order list) eg:把