Java設計模式——介面卡模式
阿新 • • 發佈:2019-01-01
設計目的: 使舊介面相容新介面,不改或少改原業務程式碼
使用場景: 公司系統框架上有一個介面A,程式設計師為了實現業務,建立一個實現了介面A的類並且在業務程式碼上大量使用介面A提供的方法。過了幾個月,公司由於某種原因,要求放棄舊介面A,改用新介面B,但是舊介面A的實現類已經被大量使用在業務程式碼了,直接實現介面B需要修改大量程式碼,很容易造成大面積的bug。
使用介面卡模式解決上述問題
類圖
白話描述:把介面B“塞到”實現了A介面的具體類ImplA(建立關聯關係)。通過ImplA的方法,呼叫介面B對應的方法。打個比方,在ImplA的send()方法裡,呼叫InterfaceB的sendMsg()。這樣的話原業務程式碼就不需要進行過多的改動。
程式碼
//舊介面A
public interface InterfaceA {
public void send();
public void receive();
public void close();
}
//實現類ImplA
public class ImplA implements InterfaceA {
InterfaceB implB;
//構造程式碼塊,建立ImplA例項時就會執行
{
implB = new ImplB();
}
@Override
public void send () {
implB.sendMsg();//刪除了原本send()的實現程式碼,改為呼叫implB.sendMsg的方法
}
@Override
public void receive() {
implB.receiveMsg();
}
@Override
public void close() {
implB.closeMsg();
}
}
//新介面B
public interface InterfaceB {
public void sendMsg();
public void receiveMsg();
public void closeMsg();
public void other();
}
//實現類ImplB
public class ImplB implements InterfaceB {
@Override
public void sendMsg() {
System.out.println("this is a new interface send method");
}
@Override
public void receiveMsg() {
System.out.println("this is a new interface receive method");
}
@Override
public void closeMsg() {
System.out.println("this is a new interface close method");
}
@Override
public void other() {
System.out.println("this is a new interface method");
}
}
//原業務程式碼,真正的專案可能會有上千個地方使用這段程式碼
public class Main {
public static void main(String[] args) {
InterfaceA implA = new ImplA();
implA.send();
implA.receive();
implA.close();
}
}
輸出結果:
this is a new interface send method
this is a new interface receive method
this is a new interface close method
看程式碼可以很容易理解,舊介面A裡面的方法直接呼叫新介面的方法,業務程式碼基本不需要變動。
同時,也體驗了面向物件的特點——封裝。使用者(業務程式碼)不需要關心物件內部程式碼如何實現。
另外,值得一提的是,舊介面可以傳入N個新介面,implB、implC。。。然後在實現方法中組合使用。當然這樣在設計上看起來有點像“策略模式”,但沒關係它仍然算是介面卡模式。
23種設計模式只是前人在面向介面的設計思想的總結,說白了只是常用於 設計 “高內聚,低耦合”系統的經驗。
學習設計模式的目的是把“六大原則”融匯貫通。