擴充卡模式(Adapter Pattern)是作為兩個不相容的接口之間的橋梁。這種類型的設計模式屬于結構型模式,它結合了兩個獨立接口的功能。
案例:
- 定義機器接口和其具體實作的兩個不同機器
/**
* @author Gjing
* 刷卡器
**/
public interface CardMachine {
/**
* 刷身份證
*/
void blushIdCard(String number);
/**
* 刷銀行卡
*/
void blushBankCard(String number);
}
/**
* 身份證刷卡器
*/
class IdCardMachine implements CardMachine{
@Override
public void blushIdCard(String number) {
System.out.println("身份證刷卡器執行刷卡,卡号:" + number);
}
@Override
public void blushBankCard(String number) {
}
}
/**
* 銀行卡刷卡器
*/
class BankCardMachine implements CardMachine {
@Override
public void blushIdCard(String number) {
}
@Override
public void blushBankCard(String number) {
System.out.println("銀行卡刷卡器執行刷卡,卡号:" + number);
}
}
- 定義機器類型枚舉
/**
* @author Gjing
* 定義機器類型
**/
public enum MachineType {
/**
* 刷卡器類型
*/
ID_CARD,BANK_CARD;
}
- 定義進階機器、處理器、外部插入口
/**
* @author Gjing
* 進階機器
**/
public interface SuperMachine {
/**
* 刷卡
*/
void blush(MachineType machineType, String number);
}
/**
* 進階機器内部處理器
*/
class SuperMachineAdapter implements SuperMachine {
@Override
public void blush(MachineType machineType, String number) {
switch (machineType) {
case ID_CARD:
CardMachine cardMachine = new IdCardMachine();
cardMachine.blushIdCard(number);
break;
case BANK_CARD:
cardMachine = new BankCardMachine();
cardMachine.blushBankCard(number);
break;
default:
throw new NullPointerException("沒有找到合适機器");
}
}
}
/**
* 進階機器提供給外部的刷卡口
*/
class SuperMachineOut implements SuperMachine {
@Override
public void blush(MachineType machineType, String number) {
SuperMachineAdapter machineAdapter = new SuperMachineAdapter();
machineAdapter.blush(machineType, number);
}
}
- 調用
/**
* @author Gjing
**/
public class Test {
public static void main(String[] args) {
SuperMachine superMachine = new SuperMachineOut();
superMachine.blush(MachineType.ID_CARD, TimeUtil.localDateTimeToStamp(LocalDateTime.now())+"");
superMachine.blush(MachineType.BANK_CARD, TimeUtil.localDateTimeToStamp(LocalDateTime.now())+"");
}
}
應用場景:
擴充卡模式就是把一個類的接口轉換成用戶端所期待的另外一種接口,進而使原接口不比對而無法在一起工作的的兩個類能在一起工作。從功能上說,這些接口不相容的類一般具有相同或相似的功能。通常我們通過修改該類的接口來解決這種接口不相容的情形,但是如果我們不願意為了一個應用而修改各原接口,或者我們壓根兒就沒有對象的源代碼的時候,擴充卡模式就會派上用場了。
優點:
1、将目标類和适配者類解耦
2、增加了類的透明性和複用性,将具體的實作封裝在适配者類中,對于用戶端類來說是透明的,而且提高了适配者的複用性.
3、靈活性和擴充性都非常好,符合開閉原則
缺點:
過多地使用擴充卡,會讓系統非常零亂,不易整體進行把握。比如,明明看到調用的是 A 接口,其實内部被适配成了 B 接口的實作,一個系統如果太多出現這種情況,無異于一場災難。是以如果不是很有必要,可以不使用擴充卡,而是直接對系統進行重構。
由于 JAVA 至多繼承一個類,是以至多隻能适配一個适配者類,而且目标類必須是抽象類。
注意:
擴充卡不是在詳細設計時添加的,而是解決正在運作的項目的問題。
以上為個人見解,如有誤歡迎各位指正