引言
今天是418旅遊節,我也出門去玩玩,突然看到一個外國友人在問路,然而他問的那個人似乎聽不懂他在說啥,我走上前去,憑著蹩腳的口語成功幫助了外國友人,感覺自己胸前的紅領巾更亮了。
正文
介面卡模式就是將原本兩個不相容的介面,通過某種方式使其能夠共同工作。介面卡模式也分為類結構性模式和物件結構性模式。前者相比後者耦合度高,並且需要開發者瞭解其內部的相關結構,故應用較少。
核心思想
通過介面卡,開發者可以重用原有的程式碼,無需修改即可呼叫。同時將目標介面和適配者解耦,解決了目標介面和適配者不一致的問題。
程式碼實現
講解
//目標介面
public interface Target {
public void request();
}
複製程式碼
//適配者
public class Apdatee {
public void specificRequest(){
System.out.println("適配者的函式被呼叫");
}
}
複製程式碼
//類介面卡
public class Adapter extends Apdatee implements Target {
@Override
public void request() {
specificRequest();
}
}
複製程式碼
//物件介面卡
public class ObjectAdapter implements Target {
private Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
複製程式碼
//呼叫
public class Client {
public static void main(String[] args) {
//類介面卡模式
Target target = new Adapter();
target.request();
//物件介面卡模式
Adaptee adaptee = new Adaptee();
Target target = new ObjectAdapter(adaptee);
target.request();
}
}
複製程式碼
例項
在引言部分中,問路是目標,外國友人是適配者,我就充當的是介面卡的角色,負責將外語翻譯給路人聽。
public interface AskWayTarget {
public void askWay();
}
複製程式碼
public class ForeignerAdaptee {
public void specificAskWay(){
System.out.println("我想知道去瘦西湖怎麼走?");
}
}
複製程式碼
//類介面卡
public class MeAdapter extends ForeignerAdaptee implements AskWayTarget {
@Override
public void askWay() {
specificAskWay();
}
}
複製程式碼
//物件介面卡
public class MeObjectAdapter implements AskWayTarget {
ForeignerAdaptee foreignerAdaptee ;
public MeObjectAdapter(ForeignerAdaptee adaptee){
this.foreignerAdaptee = adaptee;
}
@Override
public void askWay() {
foreignerAdaptee.specificAskWay();
}
}
複製程式碼
public class Main {
public static void main(String[] args) {
//物件介面卡模式
ForeignerAdaptee foreignerAdaptee = new ForeignerAdaptee();
MeObjectAdapter meObjectAdapter = new MeObjectAdapter(foreignerAdaptee);
meObjectAdapter.askWay();
//類介面卡模式
AskWayTarget askWayTarget = new MeAdapter();
askWayTarget.askWay();
}
}
複製程式碼
輸出結果
我想知道去瘦西湖怎麼走?
複製程式碼
總結
介面卡模式很好的解決了目標和適配者之間不匹配的問題。它適用於那些在使用第三方提供的元件時,其介面定義和自己所需要的介面定義不一致的問題。此外,介面卡還可以擴充為雙向介面卡模式,只需要把適配者也定義為一個介面即可,在此不做贅述,有興趣可自行實現。