按照惯例,首先咱们来看一下接口隔离原则的定义。html
类间的依赖关系应该创建在最小的接口上。编程
接口中的方法应该尽可能少,不要使接口过于臃肿,不要有不少不相关的逻辑方法。bash
有点相似于单一职责原则,都是功能尽量的简单单一,不要冗余太多其余不相关的。app
单一职责原则主要是类与方法,而接口隔离原则倒是对接口而言的。ide
小厨洗菜,大厨作饭。post
在番茄餐厅的后厨,老板与求生欲极强的厨师长在聊天。学习
老板:最近咱们番茄餐厅广受好评,菜品味道美味,这还得感谢你这位厨师长呀。spa
厨师长:应该的,这该感谢我。3d
老板:嗯?你肯定?code
厨师长:还没,还没说完,这该感谢我...们的郝老板,此次肯定了。(冷汗)
老板:你这求生欲厉害了,叹为观止呀。不过如今随着顾客的增多,人手再次不够了,再招厨师确定来不及了,你有什么好办法吗?
厨师长:办法我还真有一个,咱们能够招点小厨,小厨要好招一些。
老板:但小厨作饭不够美味,很容易流失客户的。
厨师长:小厨不作饭,小厨只负责洗菜。这样呢,大厨就不用洗菜了,只负责作饭,这样效率就上去了。
老板:你是否是不想洗菜?
厨师长:固然不是,我就是,就是,就是替公司着想。
老板:好吧,准了,招人吧。
以前咱们在依赖倒置原则聊过对接口编程,因此,首先咱们定义一个厨师接口。
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接口就能够了。
它与单一职责原则相似,优势也是相似的。
下降风险 修改其中的一个业务,不会影响到业务。
易维护易扩展 没有冗余代码,符合接口隔离原则的接口,会更加容易扩展以及维护。
接下来,请您欣赏接口隔离原则的原创歌曲。
嘻哈说:接口隔离原则
做曲:懒人
做词:懒人
Rapper:懒人
奋斗了多年总算熬成了大厨才不要关心洗菜
这些杂事都摘不掉
刚入行一两年但兢兢业业的小厨还不到烹饪大菜
由于这些来不了
因此接口功能太多在胡闹
接口功能应该尽量最少
这就是接口隔离
核心思想就是接口最小
这样才结构得体
风险下降易扩展维护也有格局
用起来它是绝对合理
复制代码
闲来无事听听曲,知识已填脑中去;
学习复习新方式,头戴耳机不小觑。
番茄课堂,学习也要酷。