一文掌握介面卡設計模式,UML圖解原始碼簡單易懂
來源:mikechen的網際網路架構
設計模式是寫出優秀程式的保障,與架構能力與閱讀原始碼的能力息息相關,對程式設計師來說非常重要,非常值得深入學習。
前面,我們介紹了:
7 大設計原則(41張圖解、2萬多字)
5 大建立型設計模式總結,20 張圖徹底掌握
介面卡模式是結構型設計模式,它的作用是連線現有程式和所需程式。
當現有功能元件與當前系統的介面規範不相容,無法直接使用時,重新開發的成本又很高,需要轉換後才能使用,介面卡模式很好地解決了這個問題。
這個描述有點抽象,列舉一個日常生活中的常見例子。
例如:
蘋果手機和華為手機的充電介面是不相容的,如果要用華為的充電器給蘋果手機充電,這時就需要轉換接頭進行適配。
隨意找了一張圖,這裡只是為了說明這個道理。
介面卡模式分為兩種:物件介面卡模式、類介面卡模式。
國際慣例,先上手撕的 UML 類圖。
1)物件介面卡模式
物件介面卡的 UML 類圖:
物件的介面卡模式的優點是靈活性高、低耦合。
其缺點是使用複雜,需要引入物件例項。
2)類介面卡模式
類介面卡模式的 UML 類圖:
應用相對少,因為耦合度較高,且要求我們瞭解現有元件庫中的相關元件的內部結構。
類介面卡模式的優點是使用方便,程式碼簡化,僅僅引入一個物件,並不需要額外的欄位來引用 Adaptee 例項。
其缺點是高耦合,靈活性低,使用物件繼承的方式,是靜態的定義方式。
3)介面卡模式的構成
介面卡模式的構成主要為 3 個部分:
Target:介面卡的內容,例如客戶端使用的目標介面;
Adaptee:被適配的內容,例如不相容的介面;
Adapter:介面卡,把
Adeptee
適配成Target
。
假設:
為了改進專案的 log 系統,我們需要開發一個三方開源日誌庫。
但這個三方開源日誌庫與專案中的介面不相容,為了解決這個問題,下面用介面卡模式來完成這個功能。
1) 確定目標介面
系統原來的日誌介面:
public interface LogFactory { void debug(String tag,String message);}
2)三方開源日誌庫的介面及實現
下面是第三方開源日誌庫提供的日誌功能,它的介面與公司系統目前使用的不相容。
public interface Logger { void d(int priority, String message, Object ... obj);}//具體提供日誌功能的實現類public class LoggerImp implements Logger { @Override public void d(int priority, String message, Object... obj) { System.out.println(String.format("logger:%s",message)); }}
3)構建介面卡類
透過介面卡類,將第三方開源日誌庫提供的介面轉換為系統的目標介面。
public class LogAdapter implements LogFactory {
private Logger Logger;
public LogAdapter(Logger Logger) {
this.Logger = Logger;
}
@Override
public void debug(String tag, String message) {
Objects.requireNonNull(Logger);
Logger.d(1, message);
}
}
LogAdapter 實現了系統的目標介面,同時持有三方庫 Logger 的引用。
4)客戶端使用
透過介面卡,客戶端很輕鬆就可以切換到新的日誌系統了。
public class AdapterClient { public void recordLog() { LogFactory logFactory = new LogAdapter(new LoggerImp()); logFactory.debug("Test", "使用logger列印log"); }}
當需要使用一個現存的類,但它提供的介面與系統的介面不相容,並且還不能修改它時;
使用第三方提供的元件,但元件介面定義和自己要求的介面定義不同時。
介面卡模式的優點:
客戶端透過介面卡,可以透明地呼叫目標介面;
複用了現存的類,不需要修改原有程式碼,就能重用現有的適配者類。
將目標類和適配者類解耦,解決了目標類和適配者類介面不一致的問題。
介面卡模式的缺點:
需要統一多個類的介面;
新舊 API 的相容,改造成本高;
過多使用介面卡,會讓系統程式碼變得凌亂,增加系統的複雜性。
透過本文,我們瞭解並掌握了介面卡模式,包括介面卡模式的概念、作用、結構、使用場景、優缺點及應用等。
只有我們了解了每一種設計模式,實際應用時才能夠合理選型,避免因強行使用設計模式、讓代碼更加不好維護的情況出現。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2997001/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 簡單易懂的設計模式(上)設計模式
- redux原始碼解讀(簡單易懂版)Redux原始碼
- 設計模式系列(圖文解析,附帶原始碼) - 介面卡設計模式原始碼
- 【設計模式】介面卡模式以及原始碼應用設計模式原始碼
- 設計模式之UML類圖設計模式
- 極簡設計模式-介面卡模式設計模式
- 詳解建造者模式(含圖例、UML類圖、原始碼示例等)模式原始碼
- 簡單易懂的Vue資料繫結原始碼解讀Vue原始碼
- Java設計模式(一):設計模式概述、UML圖、設計原則Java設計模式
- JavaScript設計模式系列五之介面卡模式(附案例原始碼)JavaScript設計模式原始碼
- 設計模式怎麼用UML圖表示?設計模式
- 設計模式(5)-建造者模式詳解(易懂)設計模式
- 8行程式碼實現快速排序,簡單易懂圖解!行程排序圖解
- 設計模式(9)-責任鏈模式詳解(易懂)設計模式
- 設計模式(2)-工廠方法模式詳解(易懂)設計模式
- 設計模式(3)-抽象工廠模式詳解(易懂)設計模式抽象
- 1.2 《硬啃設計模式》 第2章 學習設計模式需掌握的UML知識設計模式
- 簡單講解觀察者設計模式設計模式
- 設計模式----介面卡模式設計模式
- 設計模式-介面卡模式設計模式
- 設計模式:介面卡模式設計模式
- 【設計模式】介面卡模式設計模式
- 從零開始單排學設計模式「UML類圖」定級賽設計模式
- 介面卡設計模式設計模式
- Java設計模式之介面卡設計模式Java設計模式
- 設計模式--介面卡模式/代理模式設計模式
- JavaScript 設計模式 —— 介面卡模式JavaScript設計模式
- java設計模式-介面卡模式Java設計模式
- 設計模式(七)介面卡模式設計模式
- 設計模式之介面卡模式設計模式
- 設計模式之【介面卡模式】設計模式
- 設計模式(五):介面卡模式設計模式
- PHP設計模式_介面卡模式PHP設計模式
- 設計模式(十四):介面卡模式設計模式
- 設計模式超級簡單的解釋設計模式
- 物件導向設計的設計模式(一):建立型模式(附 Demo & UML類圖)物件設計模式
- 設計模式--UML關係與程式碼對照設計模式
- Javascript 設計模式之物件導向與 UML 類圖JavaScript設計模式物件