4、適配器模式總結
在對象適配器模式中,適配器與適配者之間是關聯關系;在類適配器模式中,適配器與適配者之間是繼承關系。不論是對象適配器還是類適配器,適配器模式都將現有接口轉化為客戶類所期望的接口,實現了對現有類的復用。為了避免兩個或者多個事物之間直接耦合,應該如何分配職責? 大多數情況都可以通過增加一層間接性來解決,將職責分配給中介對象,使其作為其他構件或服務之間的媒介,以避免他們之間的直接耦合。在適配器模式中,為了避免客戶類和與適配者類直接耦合,也就是客戶類直接訪問適配者類,可以增加一個適配器類,降低客戶類與適配者類的耦合性。當客戶類調用適配器的方法時,在適配器類的內部將調用適配者類的方法,而這個過程對客戶類是透明的,客戶類並不直接訪問適配者類。它是一種使用頻率非常高的設計模式,在軟件開發中得以廣泛應用。
1.主要優點
無論是對象適配器模式還是類適配器模式都具有如下優點:
(1) 將目標類和適配者類解耦,通過引入一個適配器類來重用現有的適配者類,無須修改原有結構。
(2) 增加了類的透明性和復用性,將具體的業務實現過程封裝在適配者類中,對於客戶端類而言是透明的,而且提高了適配者的復用性,同一個適配者類可以在多個不同的系統中復用。
(3) 靈活性和擴展性都非常好,通過使用配置文件,可以很方便地更換適配器,也可以在不修改原有代碼的基礎上增加新的適配器類,完全符合“開閉原則”。
具體來說,類適配器模式還有如下優點:
由於適配器類是適配者類的子類,因此可以在適配器類中置換一些適配者的方法,使得適配器的靈活性更強。
對象適配器模式還有如下優點:
(1) 一個對象適配器可以把多個不同的適配者適配到同一個目標;
(2) 可以適配一個適配者的子類,由於適配器和適配者之間是關聯關系,根據“裡氏代換原則”,適配者的子類也可通過該適配器進行適配。
2.主要缺點
類適配器模式的缺點如下:
(1) 對於Java、C#等不支持多重類繼承的語言,一次最多只能適配一個適配者類,不能同時適配多個適配者;
對象適配器模式的缺點如下:
與類適配器模式相比,要在適配器中置換適配者類的某些方法比較麻煩。如果一定要置換掉適配者類的一個或多個方法,可以先做一個適配者類的子類,將適配者類的方法置換掉,然後再把適配者類的子類當做真正的適配者進行適配,實現過程較為復雜。
3.適配器模式具體應用
(1)復用已經寫好的功能模塊,例如:已經寫好了一個員工信息模塊,要重新開發一個新的企業管理系統,可以復用員工信息模塊。
(2)程序運行時的日志信息,可以記錄到數據庫,也可以記錄到Txt文件中。現在變更需求,使日志信息能夠同時記錄到數據庫和Txt文件中。可以添加一個適配器類,適配數據庫操作和文件操作。
(3)在軟件開發過程中,我們會開發出一些功能性模塊。如排序算法模塊、查找模塊、或者封裝鏈表、隊列、樹等操作。在需要復用這些功能的時候,直接使用,無需重新開發這些功能模塊。
(4)網上銀行加密模塊開發: 已經開發好了一套網銀加密模塊,現在需要重新開發一個類似的軟件,可以直接復用已經開發好的加密模塊。
(5)某公司已經開發了一套火車票識別軟件,包含二值化、去噪、版面分析、欄目提取等模塊。現在要開發銀行卡識別項目,則可以直接復用火車票識別中的功能模塊。
(6)某公司想要開發一套輸入法軟件,可以購買搜狗輸入法的搜索模塊,直接加以復用,無需自己重頭開發。
(7)生活中的適配器: 電源適配器,USB轉串口線,水管專修工人使用各種接口連接本來沒法進行相連的管道。