## **1. 基本介紹**
>1.適配器模式(Adapter Pattern)將某個類的接口轉換成客戶端期望的另一個接口表示,主要的目的是兼容性,讓原本因接口不匹配不能一起工作的兩個類可以協同工作。其別名為包裝器(Wrapper);
2.適配器模式屬于結構型模式;
3.主要分為三類:類適配器模式,對象適配器模式,接口適配器模式。
## **2. 工作原理**
>1.適配器模式:將一個類的接口轉換成另一種接口,讓原本接口不兼容的類可以兼容;
2.從用戶的角度看不到被適配者,是解耦合的;
3.用戶調用適配器轉化出來的目標接口方法,適配器再調用被適配者的相關接口方法
4.用戶收到反饋結果,感覺只是和目標接口交互。

## **3. 類適配器**
#### 基本介紹
>Adapter類,通過繼承src類,實現dst類接口,完成src->dst的適配
#### 原理圖
>電腦3.0接口兼容鍵盤2.0接口

代碼實現
`電腦類:`
```
/**
* 電腦
*/
public class Computer {
/**
* 電腦串口為3.0
* @return
*/
public boolean usb3(){
System.out.println("電腦的USB接口為3.0");
System.out.println("該電腦串口正常運行");
return true;
}
}
```
`轉換接口:`
```
/**
* 兼容interface
*/
public interface Compatible {
boolean usb2ExchangeUSB3();
}
```
`適配器類:`
```
/**
* 適配器類
*/
public class CompatibleAdapter extends Computer implements Compatible {
/**
* 3.0接口兼容2.0接口
*/
@Override
public boolean usb2ExchangeUSB3() {
//獲取電腦的3.0接口
boolean value = super.usb3();
if (value){
//TODO 接口3.0兼容2.0接口
System.out.println("接口3.0兼容2.0接口");
return true;
}
return false;
}
}
```
`鍵盤接入類:`
```
/**
* 鍵盤接入
*/
public class Keyboard {
/**
* 鍵盤USB為2.0
* @return
*/
public boolean access(Compatible compatible){
if (compatible.usb2ExchangeUSB3()){
System.out.println("電腦,鍵盤正常運行");
return true;
}
return false;
}
}
```
`測試類:`
```
public class Client {
public static void main(String[] args) {
System.out.println("類適配器模式");
Keyboard keyboard = new Keyboard();
boolean value = keyboard.access(new CompatibleAdapter());
if (value){
System.out.println("正常3.0兼容2.0");
}else{
System.out.println("不兼容");
}
}
}
```
`執行結果:`
```
對象適配器模式
電腦的USB接口為3.0
該電腦串口正常運行
接口3.0兼容2.0接口
電腦,鍵盤正常運行
正常3.0兼容2.0
```
`注意事項`
>1.Java是單繼承機制,所以類適配器需要繼承src類,這一點算是一個缺點,因為這要求dst必須是接口,有一定的局限性;
2.src類的方法在Adapter中都會暴露出來,也增加了使用的成本;
3.由于其繼承了src類,所以它可以根據需求重寫src類的方法,使得Adapter的靈活性增強了。
## **4. 對象適配器**
#### 基本介紹
>1.基本思路和類的適配器模式相同,只是將Adapter類作修改,不是繼承src類,而是持有src類的實例,以解決兼容性的問題。即:持有src類,實現dst類接口,完成src->dst的適配;
2.根據"合成復用原則",在系統中盡量使用關聯關系來替代繼承關系,因此大部分結構型模式都是對象結構型模式;
3.對象適配器模式是適配器模式常用的一種。
#### 原理圖
>電腦3.0接口兼容鍵盤2.0接口

代碼實現
`電腦類:`
```
/**
* 電腦
*/
public class Computer {
/**
* 電腦串口為3.0
* @return
*/
public boolean usb3(){
System.out.println("電腦的USB接口為3.0");
System.out.println("該電腦串口正常運行");
return true;
}
}
```
`轉換接口:`
```
/**
* 兼容interface
*/
public interface Compatible {
boolean usb2ExchangeUSB3();
}
```
`適配器類:`
```
/**
* 適配器類
*/
public class CompatibleAdapter implements Compatible{
//使用聚合關系,符合合成復用原則
private Computer computer;
//構造方法
public CompatibleAdapter(Computer computer){
this.computer = computer;
}
/**
* 3.0接口兼容2.0接口
*/
@Override
public boolean usb2ExchangeUSB3() {
//獲取電腦的3.0接口
boolean value = computer.usb3();
if (value){
//TODO 接口3.0兼容2.0接口
System.out.println("接口3.0兼容2.0接口");
return true;
}
return false;
}
}
```
`鍵盤類:`
```
/**
* 鍵盤接入
*/
public class Keyboard {
/**
* 鍵盤USB為2.0
* @return
*/
public boolean access(Compatible compatible){
if (compatible.usb2ExchangeUSB3()){
System.out.println("電腦,鍵盤正常運行");
return true;
}
return false;
}
}
```
`測試類:`
```
/**
* 測試類
*/
public class Client {
public static void main(String[] args) {
System.out.println("對象適配器模式");
Keyboard keyboard = new Keyboard();
boolean value = keyboard.access(new CompatibleAdapter(new Computer()));
if (value){
System.out.println("正常3.0兼容2.0");
}else{
System.out.println("不兼容");
}
}
}
```
`執行結果:`
```
對象適配器模式
電腦的USB接口為3.0
該電腦串口正常運行
接口3.0兼容2.0接口
電腦,鍵盤正常運行
正常3.0兼容2.0
```
#### 注意事項
>1.對象適配器和類適配器其實算是同一種思想,只不過實現方式不同。根據合成復用原則,使用聚合替代繼承,所以它解決了類適配器必須繼承src的局限性問題,也不再要求dst必須是接口。
2.使用成本更低,更靈活。
## **5. 接口適配器**
#### 基本介紹
>1.當不需要 全部實現接口提供的方法時,設計一個抽象類實現接口,并為該接口中每個方法提供一個默認實現(空方法),那么該抽象類的子類可有選擇地覆蓋父類的某些方法來實現需求。
2.適用于一個接口不想使用其所有的方法的情況。
#### 原理圖

代碼實現
`電腦接口類:`
```
/**
* 電腦接口
*/
public interface ComputerInterface {
//電源接口
void powerInterface();
//USB接口
void usbInterface();
//串行接口
void serialInterface();
//音頻接口
void audioInterface();
}
```
`電腦抽象類適配器類:`
```
/**
* 電腦抽象類適配器
*/
public abstract class ComputerAdapter implements ComputerInterface{
//需要重寫接口的全部方法,空實現(默認實現)
@Override
public void powerInterface() {
}
@Override
public void usbInterface() {
}
@Override
public void serialInterface() {
}
@Override
public void audioInterface() {
}
}
```
`測試類:`
```
/**
* 測試類
*/
public class Client {
public static void main(String[] args) {
//匿名內部類 ComputerAdapter為抽象類
ComputerAdapter computerAdapter = new ComputerAdapter(){
//如果業務僅需要覆蓋powerInterface方法,不需要重寫其他方法
@Override
public void powerInterface() {
System.out.println("使用接口適配器模式,僅調用powerInterface方法");
}
};
computerAdapter.powerInterface();
}
}
```
`執行結果:`
```
使用接口適配器模式,僅調用powerInterface方法
```
- 前言
- 第一章 設計七大原則
- 第1節 開閉原則
- 第2節 依賴倒置原則
- 第3節 單一職責原則
- 第4節 接口隔離原則
- 第5節 迪米特法則
- 第6節 里氏替換原則
- 第7節 合成復用原則
- 第二章 簡單工廠模式
- 第1節 使用場景
- 第2節 示例代碼
- 第三章 創建者模式
- 第1節 工廠方法模式
- 第2節 抽象工廠模式
- 第3節 建造者模式
- 第4節 原型模式
- 第5節 單例模式
- 第四章 結構型模式
- 第1節 適配器模式
- 第2節 橋接模式
- 第3節 組合模式
- 第4節 裝飾者模式
- 第5節 外觀模式
- 第6節 享元模式
- 第7節 代理模式
- 第五章 行為模式
- 第1節 責任鏈模式
- 第2節 命令模式
- 第3節 迭代器模式
- 第4節 中介者模式
- 第5節 備忘錄模式
- 第6節 觀察者模式
- 第7節 狀態模式
- 第8節 策略模式
- 第9節 模板方法模式
- 第10節 訪問者模式
- 第11節 解釋器模式