[設計模式] 適配器模式 + 外觀模式
手機用戶請
橫屏
獲取最佳閱讀體驗,REFERENCES
中是本文參考的鏈接,如需要鏈接和更多資源,可以關注其他博客發佈地址。
平臺 | 地址 |
---|---|
CSDN | https://blog.csdn.net/sinat_28690417 |
簡書 | https://www.jianshu.com/u/3032cc862300 |
個人博客 | https://yiyuery.github.io/NoteBooks/ |
適配器模式
適配器模式: 將一個類的接口,轉換成客戶期望的另一個接口。適配器讓原本接口不兼容的類可以合作無間。
適配器有兩種,一種是類適配器,另一種是對象適配器。
對象適配器
利用組合的方式將請求傳送給被適配器
UML
顧名思義,ProductV2API
是新的API接口,ProductV1API
爲歷史API接口,實現類HisAPIAdaptee
爲歷史API的實現類,即被適配者。
代碼
歷史接口 & 實現
public interface ProductV1API {
/**
* V1 版本產品接口
*/
void specificRequest();
}
public class HisAPIAdaptee implements ProductV1API {
/**
* V1 版本產品接口
*/
@Override
public void specificRequest() {
System.out.println("Adaptee specificRequest");
}
}
適配器實現新的接口,並傳入歷史接口的實現類(被適配者)
public class APIAdapter implements ProductV2API {
private HisAPIAdaptee adaptee;
public APIAdapter(HisAPIAdaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
客戶端調用
//客戶端程序
public class Client {
public static void main(String[] args) {
//老接口使用
HisAPIAdaptee hisAPIAdaptee = new HisAPIAdaptee();
hisAPIAdaptee.specificRequest();
//適配後新接口對外暴露使用
new APIAdapter(hisAPIAdaptee).request();
}
}
類適配器
利用多重繼承實現,請求傳送給被被適配者
APIAdapter 繼承 ProductV1API
和 ProductV2API
的實現類,在適配器內部實現請求方法的轉發。
但是Java中不允許這樣做!
適配器和裝飾者模式
各自特點
- 適配器用來封裝接口,解決接口版本迭代對客戶端的兼容問題,適配器將一個接口轉成另一個接口
- 裝飾者模式用來包裹對象,補充對象屬性,被裝飾者可以被裝飾器替代使用,支持多層嵌套。
- 裝飾者模式不改變接口,但是加入責任
相似點
- 都是通過包裹將操作委派給被裝飾者和被適配者
- 都會實現公共接口或是抽象基類
外觀模式
外觀模式:提供一個統一的接口,用來訪問子系統的一羣接口,外觀定義了一個高層接口,讓子系統更容易使用
UML
//定義外觀行爲
public interface Facade {
/**
* 開啓
*/
void on();
/**
* 關閉
*/
void off();
}
//實現外觀行爲並針對每個子系統進行統一的外觀包裝
//燈光控制
public class LightAPI implements Facade {
/**
* 開啓
*/
@Override
public void on() {
System.out.println("Light turned on!");
}
/**
* 關閉
*/
@Override
public void off() {
System.out.println("Light turned off!");
}
}
//TV控制
public class TVAPI implements Facade {
/**
* 開啓
*/
@Override
public void on() {
System.out.println("TV turned on!");
}
/**
* 關閉
*/
@Override
public void off() {
System.out.println("TV turned off!");
}
}
//全局外觀控制
public class FacadeImpl implements Facade {
LightAPI light = new LightAPI();
TVAPI tv = new TVAPI();
/**
* 開啓
*/
@Override
public void on() {
light.on();
tv.on();
}
/**
* 關閉
*/
@Override
public void off() {
light.off();
tv.off();
}
}
外觀行爲的接口定義可以換成其他具體類,非必要實現,外觀模式的重點的是封裝一批接口,對外提供一個高層接口。
設計原則:
- 最少知識原則(只和親密的朋友交談)
總結
適配器模式
- 當一個現有的類的使用,但是對應接口無法符合你的需要時,可以使用。
- 可以改變接口以符合客戶的期望
- 適配器實現的複雜度和目標接口的大小和複雜度成正比
- 類適配器需要使用多重繼承,Java中無法使用
- 適配器講一個對象包裝起來以改變其接口
外觀模式:
- 將客戶從一個複雜子系統中解耦,提供一個高層次的應用接口。
- 不同子系統接口的組合可以實現多個外觀,視需求和接口複雜度而定。
- 將一羣對象包裝起來以簡化其接口
裝飾者模式:
- 將一個對象包裝起來,以增加新的行爲和責任
更多
掃碼關注
架構探險之道
,回覆文章標題,獲取本文相關源碼和資源鏈接
知識星球(掃碼加入獲取歷史源碼和文章資源鏈接)