Java設(shè)計模式七大原則之接口隔離原則詳解
定義
接口隔離原則(Interface Segregation Principle),又稱為ISP原則,官方定義為
1.客戶端不應(yīng)該依賴它不需要的接口
2.類間的依賴關(guān)系應(yīng)該建立在最小的接口上
簡單點來講就是在一個類中不要定義過多的方法,接口應(yīng)該盡量簡單細化
案例
需求
假設(shè)有這樣一個案例場景,現(xiàn)在有一個接口Repair,給定他有三個能力,可以修汽車,修火車,修飛機, 兩個實現(xiàn)類張師傅,李師傅分別具有這些能力,有一個4S店類,假設(shè)是需要張師傅來修汽車和修飛機,而另一個4s店類需要李師傅來修汽車和修火車
方案一
定義維修接口類Repair.java
/**
* 維修類
* @author:liyajie
* @createTime:2022/1/29 17:00
* @version:1.0
*/
public interface Repair {
/**
* 維修汽車
* @author: liyajie
* @date: 2022/1/29 17:03
* @param
* @return void
* @exception:
* @update:
* @updatePerson:
**/
void car();
/**
* 維修火車
* @author: liyajie
* @date: 2022/1/29 17:03
* @param
* @return void
* @exception:
* @update:
* @updatePerson:
**/
void train();
/**
* 維修飛機
* @author: liyajie
* @date: 2022/1/29 17:03
* @param
* @return void
* @exception:
* @update:
* @updatePerson:
**/
void air();
}維修李師傅類RepairLi.java
/**
* 維修類
* @author:liyajie
* @createTime:2022/1/29 17:00
* @version:1.0
*/
public class RepairLi implements Repair{
@Override
public void car() {
System.out.println("李師傅修汽車");
}
@Override
public void train() {
System.out.println("李師傅修火車");
}
@Override
public void air() {
System.out.println("李師傅修飛機");
}
}維修王師傅類RepairWang.java
/**
* 維修類
* @author:liyajie
* @createTime:2022/1/29 17:00
* @version:1.0
*/
public class RepairWang implements Repair{
@Override
public void car() {
System.out.println("王師傅修汽車");
}
@Override
public void train() {
System.out.println("王師傅修火車");
}
@Override
public void air() {
System.out.println("王師傅修飛機");
}
}4s店1
/**
* 4s店1
* @author:liyajie
* @createTime:2022/1/29 17:07
* @version:1.0
*/
public class S1Shop {
/**
* 修汽車
* @author: liyajie
* @date: 2022/1/29 17:10
* @param repair
* @return void
* @exception:
* @update:
* @updatePerson:
**/
public void car(Repair repair){
repair.car();
}
/**
* 修火車
* @author: liyajie
* @date: 2022/1/29 17:10
* @param repair
* @return void
* @exception:
* @update:
* @updatePerson:
**/
public void train(Repair repair){
repair.train();
}
}4s店2
/**
* 4s店2
* @author:liyajie
* @createTime:2022/1/29 17:07
* @version:1.0
*/
public class S2Shop {
/**
* 修汽車
* @author: liyajie
* @date: 2022/1/29 17:10
* @param repair
* @return void
* @exception:
* @update:
* @updatePerson:
**/
public void car(Repair repair){
repair.car();
}
/**
* 修飛機
* @author: liyajie
* @date: 2022/1/29 17:10
* @param repair
* @return void
* @exception:
* @update:
* @updatePerson:
**/
public void air(Repair repair){
repair.air();
}
}測試類1
/**
* 測試類1
* @author:liyajie
* @createTime:2022/1/29 16:46
* @version:1.0
*/
public class Test1 {
public static void main(String[] args) {
// 4s店1
new S1Shop().car(new RepairLi());
new S1Shop().train(new RepairLi());
// 4s店2
new S2Shop().car(new RepairWang());
new S2Shop().air(new RepairWang());
}
}方案二
定義維修汽車接口
/**
* 維修類
* @author:liyajie
* @createTime:2022/1/29 17:00
* @version:1.0
*/
public interface RepairCar {
/**
* 維修汽車
* @author: liyajie
* @date: 2022/1/29 17:03
* @param
* @return void
* @exception:
* @update:
* @updatePerson:
**/
void car();
}定義維修火車類
/**
* 維修類
* @author:liyajie
* @createTime:2022/1/29 17:00
* @version:1.0
*/
public interface RepairTrain {
/**
* 維修火車
* @author: liyajie
* @date: 2022/1/29 17:03
* @param
* @return void
* @exception:
* @update:
* @updatePerson:
**/
void train();
}定義維修飛機類
/**
* 維修類
* @author:liyajie
* @createTime:2022/1/29 17:00
* @version:1.0
*/
public interface RepairAir {
/**
* 維修飛機
* @author: liyajie
* @date: 2022/1/29 17:03
* @param
* @return void
* @exception:
* @update:
* @updatePerson:
**/
void air();
}4s店1
/**
* 4s店1
* @author:liyajie
* @createTime:2022/1/29 17:07
* @version:1.0
*/
public class S1ShopNew {
/**
* 修汽車
* @author: liyajie
* @date: 2022/1/29 17:10
* @param repairCar
* @return void
* @exception:
* @update:
* @updatePerson:
**/
public void car(RepairCar repairCar){
repairCar.car();
}
/**
* 修火車
* @author: liyajie
* @date: 2022/1/29 17:10
* @param repairTrain
* @return void
* @exception:
* @update:
* @updatePerson:
**/
public void train(RepairTrain repairTrain){
repairTrain.train();
}
}4s店2
/**
* 4s店2
* @author:liyajie
* @createTime:2022/1/29 17:07
* @version:1.0
*/
public class S2ShopNew {
/**
* 修汽車
* @author: liyajie
* @date: 2022/1/29 17:10
* @param repairCar
* @return void
* @exception:
* @update:
* @updatePerson:
**/
public void car(RepairCar repairCar){
repairCar.car();
}
/**
* 修飛機
* @author: liyajie
* @date: 2022/1/29 17:10
* @param repairAir
* @return void
* @exception:
* @update:
* @updatePerson:
**/
public void air(RepairAir repairAir){
repairAir.air();
}
}測試類
/**
* 測試類1
* @author:liyajie
* @createTime:2022/1/29 16:46
* @version:1.0
*/
public class Test2 {
public static void main(String[] args) {
// 4s店1
new S1ShopNew().car(new RepairLiNew());
new S1ShopNew().train(new RepairLiNew());
// 4s店2
new S2ShopNew().car(new RepairWangNew());
new S2ShopNew().air(new RepairWangNew());
}
}對比分析
方案一,違反了接口隔離原則,因為李師傅和王師傅都實現(xiàn)了維修接口的三個方法:修汽車,修火車,修飛機。但需求中并不需要這么多,只需要李師傅修汽車和火車,王師傅修汽車和飛機,依賴關(guān)系不是建立在最小接口上
方案二,遵守了接口隔離原則,對李師傅和王師傅類都進行了接口隔離,實現(xiàn)了各自的兩個方法,避免了耦合
總結(jié)
通過上面兩個案例,我們可以得到以下結(jié)論: 接口隔離原則就是當我一個類通過接口依賴(使用)另一個類的時候,要保證依賴的該接口是最小的,接口里面有方法用不到的,就進行隔離,而隔離的做法就是,就對原來接口進行拆分,拆分為最小粒度,來避免耦合。
小知識點
有沒有發(fā)現(xiàn)接口隔離原則與我們上一篇的單一職責原則有點相似,來看下他們的相同點和不同點吧
相同點
都要求對結(jié)構(gòu)進行拆分,都要求更小的粒度,都希望減少耦合
不同點
1.單一職責原則:類與接口職責單一,注重的是職責
2.接口隔離原則:要求我們盡量使用多個專門的接口,注重的是接口的設(shè)計
以上就是Java設(shè)計模式七大原則之接口隔離原則詳解的詳細內(nèi)容,更多關(guān)于Java接口隔離原則的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot整合Mybatis-Plus+Druid實現(xiàn)多數(shù)據(jù)源配置功能
本文主要講解springboot?+mybatisplus?+?druid?實現(xiàn)多數(shù)據(jù)源配置功能以及一些必要的準備及代碼說明,具有一定的參考價值,感興趣的小伙伴可以借鑒一下2023-06-06
SpringBoot+RabbitMQ+Redis實現(xiàn)商品秒殺的示例代碼
本文主要介紹了SpringBoot+RabbitMQ+Redis實現(xiàn)商品秒殺,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
如何利用Spring的@Import擴展點與spring進行無縫整合
這篇文章主要介紹了如何利用Spring的@Import擴展點與spring進行無縫整合的實例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
MyEclipse2017創(chuàng)建Spring項目的方法
這篇文章主要為大家詳細介紹了MyEclipse2017創(chuàng)建Spring項目的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03

