【本人禿頂程式設計師】Java設計模式-介面卡模式
←←←←←←←←←←←← 快,點關注!
介面卡模式(Adapter Pattern):將一個介面轉換成呼叫者希望的另一個介面,使介面不相容的那些類可以一起工作,其別名為包裝類(Wrapper),該模式可以作為類結構型模式,也可以作為物件結構型模式
介面卡模式應該是 Android 開發當中最常見的幾個設計模式之一了,各種各樣的列表(ListView,GridView,RecyclerView)都要使用一個 Adapter 的類
使用場景:
- 系統需要使用現有的類,而這些類的介面不符合系統的需要
- 想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作
介面卡模式一個可以分為三個介面卡:
- 類介面卡
- 物件介面卡
- 預設介面卡
類介面卡
- Target:目標角色,可以是一個抽象類或介面,由於是類介面卡,不能為具體類
- Adaptee:適配者類,一般是一個具體類,包含期望的業務方法,某些情況下可能沒有適配者的原始碼
- Adapter:介面卡類,可以把源介面轉換成目標介面
使用 Mac 的同學應該很熟悉上面的兩個東西,Apple 的充電器可以把兩腳的充電頭拔掉換成一個更長且是三腳的充電頭,下面就以這兩個東西為示例,完成一個介面卡模式,示例程式碼:
Target 類:
public interface Power { /** * 充電 */ void charge(); }
在正常情況下用兩腳的插頭已經足夠滿足需求了,但是現在所處的環境只有三腳的插板,現在就可以把只支援三腳的插板看做是現有的介面,而預設的充電是不支援此介面的,這時候就需要用到三腳的介面卡,示例程式碼:
Adaptee 類,期望實現的功能:
public class ExtensionPower {
public void specificPower() {
LogUtils.i("用三腳,1.8米延長線充電");
}
}
Adapter 類,三腳延長線:
public class PowerAdapter extends ExtensionPower implements Power{ @Override public void charge() { super.specificPower(); } }
Client 類:
public class Client {
PowerAdapter powerAdapter = new PowerAdapter();
powerAdapter.charge();
}
利用介面卡模式就可以解決上述的問題,並且非常符合開閉原則
物件介面卡
物件介面卡不在使用類介面卡繼承再實現的方式,而是採用直接關聯的方式,區別就在於 adapter 類:
public class PowerAdapter implements Power {
private ExtensionPower extensionPower;
// 此處改為直接關聯的方式
public PowerAdapter(ExtensionPower extensionPower) {
this.extensionPower = extensionPower;
}
@Override
public void charge() {
this.extensionPower.specificPower();
}
}
預設介面卡
當我們只想實現一個介面 N 多個方法中的一個時,就要用到該模式了,在具體實現類和介面中間設計一個抽象類實現該介面,並提供所有方法的空實現,具體實現類就可以繼承抽象類,這樣就可以選擇自己想要實現的某一介面
舉個栗子:一個已婚人士的生活是吃飯,睡覺以及啪啪啪,但是現在需要需要新增一個新的物種叫做單身狗,單身狗當然是沒有啪啪啪功能的,這個時候就需要建立一個抽象類實現已婚人士這個介面,並讓單身狗繼承實現吃飯和睡覺的功能
示例程式碼:
已婚人士介面:
public interface MarriedPeople {
/**
* 吃飯
*/
void eat();
/**
* 睡覺
*/
void sleep();
/**
* 啪啪啪
*/
void papapa();
}
抽象類:
public abstract class Adults implements MarriedPeople {
@Override
public void eat() {
}
@Override
public void sleep() {
}
@Override
public void papapa() {
}
}
單身狗:
public class SingleDog extends Adults {
public void eat() {
LogUtils.i("吃飯");
}
public void sleep() {
LogUtils.i("睡覺");
}
}
說了這麼多,該到總結的時候了,介面卡模式優點:
- 使用介面卡類達到重用先用適配者類,無須修改原有結構
- 增加類的透明性和複用性,具體業務邏輯都封裝在適配者類中,提高適配者的複用性
歡迎大家加入粉絲群:963944895,群內免費分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服務、Dubbo框架、Redis快取、RabbitMq訊息、JVM調優、Tomcat容器、MySQL資料庫教學視訊及架構學習思維導圖