内容简介:按照惯例,首先我们来看一下接口隔离原则的定义。类间的依赖关系应该建立在接口中的方法应该尽量少,不要使接口过于臃肿,不要有很多不相关的逻辑方法。
按照惯例,首先我们来看一下接口隔离原则的定义。
类间的依赖关系应该建立在 最小的接口 上。
接口中的方法应该尽量少,不要使接口过于臃肿,不要有很多不相关的逻辑方法。
有点类似于单一职责原则,都是功能尽可能的简单单一,不要冗余太多其他不相关的。
单一职责原则主要是类与方法,而接口隔离原则却是对接口而言的。
2、场景
小厨洗菜,大厨做饭。
在番茄餐厅的后厨,老板与求生欲极强的厨师长在聊天。
老板:最近我们番茄餐厅广受好评,菜品味道美味,这还得感谢你这位厨师长呀。
厨师长:应该的,这该感谢我。
老板:嗯?你确定?
厨师长:还没,还没说完,这该感谢我...们的郝老板,这次确定了。(冷汗)
老板:你这求生欲厉害了,叹为观止呀。不过现在随着顾客的增多,人手再次不够了,再招厨师肯定来不及了,你有什么好办法吗?
厨师长:办法我还真有一个,我们可以招点小厨,小厨要好招一些。
老板:但小厨做饭不够美味,很容易流失客户的。
厨师长:小厨不做饭,小厨只负责洗菜。这样呢,大厨就不用洗菜了,只负责做饭,这样效率就上去了。
老板:你是不是不想洗菜?
厨师长:当然不是,我就是,就是,就是替公司着想。
老板:好吧,准了,招人吧。
3、代码
之前我们在依赖倒置原则聊过 对接口编程 ,所以,首先我们定义一个厨师接口。
package com.fanqiekt.principle.segregation; /** * 厨师接口 * * @author 番茄课堂-懒人 */ public interface IChef { /** * 洗菜 */ void wash(); /** * 做饭 */ void cooking(); } 复制代码
厨师做两件事,一个是洗菜,一个是做菜。
接下来,我们写一下大厨的代码,大厨实现了厨师接口。
大厨做饭,但不负责洗菜。
package com.fanqiekt.principle.segregation; /** * 大厨 * * @author 番茄课堂-懒人 */ public class BigChef implements IChef { /** * 洗菜的逻辑与大厨无关 */ @Override public void wash() { } @Override public void cooking() { System.out.println("大厨做饭"); } } 复制代码
我们再写一下小厨的部分,小厨也是实现厨师接口。
小厨不做饭,小厨只洗菜。
package com.fanqiekt.principle.segregation; /** * 小厨 * * @author 番茄课堂-懒人 */ public class Kitchen implements IChef { @Override public void wash() { System.out.println("小厨洗菜"); } /** * 做饭的逻辑与小厨无关 */ @Override public void cooking() { } } 复制代码
这样的写法,好不好?
当然不好,每个类都冗余了与他不相关的方法。例如,BigChef中的wash方法、Kitchen中的cooking方法。
这种现象是怎么导致的呢?
接口不够最小化。接口隔离原则就是为了解决这种问题的。
我们可以写成两个接口,一个是做饭的接口,一个是洗菜的接口。
package com.fanqiekt.principle.segregation; /** * 做饭接口 * * @author 番茄课堂-懒人 */ public interface ICook { /** * 做饭 */ void cooking(); } 复制代码
做饭的接口。
package com.fanqiekt.principle.segregation; /** * 洗菜接口 * * @author 番茄课堂-懒人 */ public interface IWash { /** * 洗菜 */ void wash(); } 复制代码
洗菜的接口。
我们再来看一下符合接口隔离原则的具体实现类。
package com.fanqiekt.principle.segregation; /** * 大厨 * * @author 番茄课堂-懒人 */ public class BigChef implements ICook{ /** * 大厨只负责做饭,只处理和做饭相关的逻辑 */ @Override public void cooking() { System.out.println("大厨做饭"); } } 复制代码
这样就没有冗余代码了。
package com.fanqiekt.principle.segregation; /** * 小厨 * * @author 番茄课堂-懒人 */ public class Kitchen implements IWash { /** * 小厨只负责洗菜,只处理和洗菜相关的逻辑 */ @Override public void wash() { System.out.println("小厨洗菜"); } } 复制代码
小厨同样也没有冗余代码了。
这样的写法是不是更加的优雅了。
如果新增一种既洗菜又做饭的厨师类型,那同时实现ICook与IWash接口就可以了。
3、优点
它与单一职责原则类似,优点也是类似的。
降低风险修改其中的一个业务,不会影响到业务。
易维护易扩展没有冗余代码,符合接口隔离原则的接口,会更加容易扩展以及维护。
4、嘻哈说
闲来无事听听曲,知识已填脑中去; 学习复习新方式,头戴耳机不小觑。
番茄课堂,学习也要酷。
接下来,请您欣赏懒人为接口隔离原则创作的歌曲。
嘻哈说:接口隔离原则 奋斗了多年总算熬成了大厨才不要关心洗菜 这些琐事都摘不掉 刚入行一两年但兢兢业业的小厨还不到烹饪大菜 因为这些来不了 所以接口功能太多在胡闹 接口功能应该尽可能最少 这就是接口隔离 核心思想就是接口最小 这样才结构得体 风险降低易扩展维护也有格局 用起来它是绝对合理 复制代码
以上所述就是小编给大家介绍的《嘻哈说:设计模式之接口隔离原则》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C++ API设计
[美] Martin Reddy / 刘晓娜、臧秀涛、林健 / 人民邮电出版社 / 2013-8 / 89.00
现代软件开发中的一大难题就是如何编写优质的API。API负责为某个组件提供逻辑接口并隐藏该模块的内部细节。多数程序员依靠的是经验和冒险,从而很难达到健壮、高效、稳定、可扩展性强的要求。Martin Reddy博士在自己多年经验基础之上,对于不同API风格与模式,总结出了API设计的种种最佳策略,着重针对大规模长期开发项目,辅以翔实的代码范例,从而有助于设计决策的成功实施,以及软件项目的健壮性及稳定......一起来看看 《C++ API设计》 这本书的介绍吧!