介紹 客戶端不應該依賴它不需要的介面,即 一個類對另一個類的依賴應該建立在最小介面上 。 Demo引入 先來看一張圖: 如上圖所示:類A通過介面MyInterface依賴類B,類C通過介面MyInterface依賴類D;但是,類A只是想要使用B實現的介面MyInterface中的1,2,3方法,類C ...
介紹
客戶端不應該依賴它不需要的介面,即一個類對另一個類的依賴應該建立在最小介面上。
Demo引入
先來看一張圖:
interface MyInterface {
void operation1();
void operation2();
void operation3();
void operation4();
void operation5();
}
class B implements MyInterface {
@Override
public void operation1() {
System.out.println("B實現了operation1");
}
@Override
public void operation2() {
System.out.println("B實現了operation2");
}
@Override
public void operation3() {
System.out.println("B實現了operation3");
}
@Override
public void operation4() {
System.out.println("B實現了operation4");
}
@Override
public void operation5() {
System.out.println("B實現了operation5");
}
}
class D implements MyInterface {
@Override
public void operation1() {
System.out.println("D實現了operation1");
}
@Override
public void operation2() {
System.out.println("D實現了operation2");
}
@Override
public void operation3() {
System.out.println("D實現了operation3");
}
@Override
public void operation4() {
System.out.println("D實現了operation4");
}
@Override
public void operation5() {
System.out.println("D實現了operation5");
}
}
class A {
//類A通過介面MyInterface依賴(使用)B類, 但是只使用1,2,3方法
public void depand1(MyInterface myInterface) {
myInterface.operation1();
}
public void depand2(MyInterface myInterface) {
myInterface.operation2();
}
public void depand3(MyInterface myInterface) {
myInterface.operation3();
}
}
class C {
public void depand1(MyInterface myInterface) {
myInterface.operation1();
}
public void depand4(MyInterface myInterface) {
myInterface.operation4();
}
public void depand5(MyInterface myInterface) {
myInterface.operation5();
}
}
如上圖所示:類A通過介面MyInterface依賴類B,類C通過介面MyInterface依賴類D;但是,類A只是想要使用B實現的介面MyInterface中的1,2,3方法,類C想要使用類D實現的介面MyInterface中的1,4,5方法;所以,現在的設計,從介面隔離原則的角度來說,不符合“最小介面”。
改進措施:
既然介面MyInterface中的方法對於實現類來說,不是全部都需要的,那麼,我們根據需求,將原來的介面進行拆分:
如圖所示: 將原來的一個介面拆分為三個,對應的code如下:
interface MyInterface1 {
void operation1();
}
interface MyInterface2 {
void operation2();
void operation3();
}
interface MyInterface3 {
void operation4();
void operation5();
}
class B implements MyInterface1, MyInterface2 {
@Override
public void operation1() {
System.out.println("B實現了operation1");
}
@Override
public void operation2() {
System.out.println("B實現了operation2");
}
@Override
public void operation3() {
System.out.println("B實現了operation3");
}
}
class D implements MyInterface1, MyInterface3 {
@Override
public void operation1() {
System.out.println("D實現了operation1");
}
@Override
public void operation4() {
System.out.println("D實現了operation4");
}
@Override
public void operation5() {
System.out.println("D實現了operation5");
}
}
class A {
//類A通過介面MyInterface依賴(使用)B類, 但是只使用1,2,3方法
public void depand1(MyInterface1 myInterface) {
myInterface.operation1();
}
public void depand2(MyInterface2 myInterface) {
myInterface.operation2();
}
public void depand3(MyInterface2 myInterface) {
myInterface.operation3();
}
}
class C {
public void depand1(MyInterface1 myInterface) {
myInterface.operation1();
}
public void depand4(MyInterface3 myInterface) {
myInterface.operation4();
}
public void depand5(MyInterface3 myInterface) {
myInterface.operation5();
}
}
總結
介面的設計儘量要小
這是介面隔離的核心,當然過小的介面會導致項目結構的負責度增加,在實際使用中,要合理把握尺度。
介面要高內聚
即介面儘量少的公佈public方法,在項目開發中,介面通常充當規範來使用,是一種承諾,承諾越少越有利於系統開發。