DesignPattern系列__02接口隔離原則
介紹
客戶端不應該依賴它不需要的接口,即一個類對另一個類的依賴應該建立在最小接口上。
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方法,在項目開發中,接口通常充當規范來使用,是一種承諾,承諾越少越有利于系統開發。

浙公網安備 33010602011771號