在寫「策略模式」的時候,筆者就用「日誌」舉了例子,這篇文章還是要以日誌為例。
日誌的重要性筆者這裡不再多言了,大家在系統開發中記錄日誌的時候,有沒有考慮過這樣乙個問題:萬一使用的日誌框架要更換呢?
一旦更換你需要怎麼做?修改所有的**,替換logger
類嗎?如果這麼做的話,不管是對系統,還是對開發者來說,都是個災難。有沒有一種更優雅的解決方式呢?
在系統設計之初,開發者就需要考慮到這一點:封裝日誌抽象,為第三方日誌框架做適配。防止日後更換日誌框架時帶來的災難。
我不管第三方日誌框架是如何實現的,我只需要定義我們系統日誌需要具備哪些功能即可,如果要引入三方庫,就把它適配成我們系統需要的。
事實上,slf4j就是這麼做的,它本身並不提供日誌功能,它是乙個「簡單日誌門面」,只是將三方庫適配成了它定義的日誌介面。本篇不會討論slf4j的實現。
現在假設系統可能需要三種日誌實現:jdk日誌、log4j、logback,我們試著用**來描述這個適配的過程,類圖設計如下:
編寫logger
介面,定義日誌具備的功能:
public
inte***ce
logger
jdkloggeradapter
適配jdk日誌:
public
class
jdkloggeradapter
implements
logger
@override
public
void
trace
(string message)
@override
public
void
debug
(string message)
@override
public
void
info
(string message)
@override
public
void
warn
(string message)
@override
public
void
error
(string message, throwable t)
}
log4jloggeradapter
適配log4j日誌:
public
class
log4jloggeradapter
implements
logger
@override
public
void
trace
(string message)
@override
public
void
debug
(string message)
@override
public
void
info
(string message)
@override
public
void
warn
(string message)
@override
public
void
error
(string message, throwable t)
}
logbackloggeradapter
適配logback日誌:
public
class
logbackloggeradapter
implements
logger
@override
public
void
trace
(string message)
@override
public
void
debug
(string message)
@override
public
void
info
(string message)
@override
public
void
warn
(string message)
@override
public
void
error
(string message, throwable t)
}
定義日誌列舉:
public
enum logenum
如何優雅的生成日誌物件呢?當然是日誌工廠了。
public
class
logge***ctory
public
static logger getlogger
(class<
?> c)
}}
客戶端這樣呼叫:
public
class
client
}
看到沒,客戶端完全不關心底層到底用的是什麼日誌框架,它只依賴日誌抽象,只知道日誌具備5個記錄方法,至於到底是如何記錄日誌的,管我什麼事呢?你只管把三方庫適配成我想要的介面,我只負責呼叫。
這就是介面卡模式!
將乙個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。介面卡模式通用類圖介面卡在生活中也很常見,例如:電源介面卡,3.5mm轉type-c耳機線等。簡單地說,介面卡模式就是將介面或類轉換成另一種介面或類。
如下圖,兩個不能一起工作的圖形,通過乙個介面卡的加入可以協同工作了。
可以在不修改原始碼的情況下讓兩個原本不能協同工作的類一起工作,符合「開閉原則」。
對高層模組遮蔽底層實現,介面卡對源物件進行了封裝。
提高了類的復用性。
非常靈活,介面卡對現有**無侵入性,現有物件無需知道介面卡的存在,哪天不想用了直接刪掉即可。
只要你想修改乙個已經上線執行的介面,你就可以考慮使用「介面卡模式」。
「介面卡模式」是一種補救方案,針對已經上線的介面,如果修改原始碼風險很大,則可以考慮使用介面卡模式來進行調整,在系統設計之初請忘記它的存在吧!
介面卡模式 預設介面卡,類介面卡,物件介面卡
模式思想 改變乙個類的對外介面 增加或減少 以滿足不同外部呼叫者的需求 角色成員 目標介面 target 客戶所期待的介面。目標可以是具體的或抽象的類,也可以是介面。需要適配的類 adaptee 需要適配的類或適配者類。介面卡 adapter 通過包裝乙個需要適配的物件,把原介面轉換成目標介面。適配...
介面卡模式(類介面卡 物件介面卡)
做個筆記 引用 public inte ce usb public inte ce psp public class usber implements usb 類介面卡 psp適用usb介面 public class usbadapter extends usber implements psp 物...
介面卡模式 物件介面卡
介面卡模式 adapter 將乙個類的介面轉換成客戶希望的另外乙個介面。adapter模式使得原來由於不相容而不能一起工作的那些類可以一起工作。介面卡模式主要應用於希望復用一些現存的類,但是介面又與復用環境要求不一致的情況。在gof的設計模式中,對介面卡模式講了兩種型別,類介面卡模式和物件介面卡模式...