【设计模式】适配器模式 ( 概念 | 适用场景 | 优缺点 | 外观模式对比 | 适配器模式相关角色 | 类适配器 | 对象适配器 | 实现流程 )
文章目錄
- I . 適配器模式概念
- II . 適配器模式 適用場景
- III . 適配器模式 優缺點
- IV . 適配器模式 與 外觀模式對比
- V . 適配器模式 相關角色 ( 重點 )
- VI . 適配器模式 ( 類適配器 ) 代碼實現流程 ( 重點 )
- VII . 適配器模式 ( 對象適配器 ) 代碼實現流程 ( 重點 )
I . 適配器模式概念
適配器模式 :
① 設計模式類型 : 結構型 ;
② 概念 : 將 類的接口 轉換成用戶可以調用的 另外一個接口 ;
③ 目的 : 使接口不兼容的兩個類可以一起工作 ;
④ 概念中的三個角色 : 被適配者 ( 現有的功能類 ) , 用戶目標接口 ( 用戶調用的接口 ) , 適配器類 ( 用戶通過調用該類 , 間接調用 被適配者類 ) ;
⑤ 簡易原理 : 適配器類 實現用戶目標接口 , 在該接口的實現類中調用被適配者 , 實現了接口轉接的效果 ; 使用的時候 , 通過創建適配器類 , 即可間接調用被適配者方法 ;
II . 適配器模式 適用場景
1 . 功能正確但接口不匹配 : 對于之前開發好的類 , 該類的操作和返回值都是正確的 , 但是其定義的方法接口無法調用 , 此時使用適配器模式 , 使該類與用戶的接口匹配 , 讓用戶使用適配器的接口 , 間接調用該類 ;
2 . 適配器模式使用階段 : 軟件設計開發階段一般不使用適配器模式 , 在軟件維護時 , 出現操作和返回值類似 , 但是函數接口不同 , 為了適配第三方系統的接口 , 使用適配器模式 ;
設計階段不要使用適配器模式 ;
3 . 適配器的兩種實現方式 : 對象適配器模式 與 類適配器 ;
① 對象適配器 : 符合組合復用原則 , 使用了委托機制 ; ( 通過組合實現 , 適配器類中維護被適配者成員 )
② 類適配器 : 通過類的繼承實現適配器模式 ; ( 通過繼承實現 , 適配器類繼承被適配者類 )
推薦使用對象適配器模式 , 在繼承與組合二者之間 , 優先選擇組合方案 ;
III . 適配器模式 優缺點
1 . 適配器模式 優點 :
① 復用且不修改類 : 不改變現有類的基礎上 , 提高類的復用性 , 透明性 ; 讓現有類與目標類接口匹配 ;
② 降低耦合 : 目標類 ( 用戶調用的接口所在類 ) 和 現有類 ( 被適配者 ) 解除耦合 , 降低了系統的耦合性 , 易于擴展維護 ;
③ 符合開閉原則 : 用戶調用適配器接口 , 只與適配器類進行交互 , 如果需要修改擴展 , 只需要修改適配器類即可 , 目標類 和 現有類 各自都是相互獨立的 , 互不影響 ;
2 . 適配器模式 優點 :
① 增加復雜性 : 編寫適配器類時 , 需要考慮全面 , 包括被適配者 和 目標類 , 系統復雜性會增加 ;
② 降低可讀性 : 系統代碼可讀性降低 , 可維護性降低 ;
閱讀代碼時 , 調用系統接口 , 如果調用的是適配器接口 , 還要到處找調用的是哪個現有類的實際接口 ;
IV . 適配器模式 與 外觀模式對比
1 . 相同點 : 都是對現有類進行封裝 ;
2 . 行為分析 :
① 外觀模式行為 : 外觀模式定義了新街口 , 處理多個子系統之間的交互 ;
② 適配器模式行為 : 適配器模式復用原有接口 , 只是簡單的轉接了一下 , 使兩個現存接口 ( 現有類 和 目標類 ) 協同工作 ;
3 . 適配力度分析 :
① 外觀模式 : 適配力度很大 , 需要開發整個子系統之間的交互流程 ;
② 適配器模式 : 修改很少的內容 , 只是進行簡單的接口轉接交互 , 一般不實現具體的功能 ;
V . 適配器模式 相關角色 ( 重點 )
1 . 被適配者 : 實際功能提供者 , 是系統中原有的類 ;
2 . 用戶目標接口 : 用戶調用該接口 , 實現功能操作 ; 是適配器的父類接口 ;
3 . 適配器 : 需要實現 用戶目標接口 , 并在接口中的操作中 , 調用被適配者提供的實際功能 ; 適配器有兩種途徑實現 , 分別是類適配器 , 對象適配器 ;
① 類適配器 : 繼承被適配者 , 通過 super 訪問被適配者方法 ;
② 對象適配器 ( 推薦 ) : 在適配器中維護一個被適配者成員變量 , 通過成員變量訪問被適配者方法 ;
VI . 適配器模式 ( 類適配器 ) 代碼實現流程 ( 重點 )
1 . 明確被適配者 : 被適配者 是一個現有類 , 該類保持不變 ;
2 . 定義用戶目標接口 : 用戶通過調用該接口 , 實現實際的功能 , 該功能與適配者中的功能類似 , 但 接口不同 ;
3 . 聲明適配器 ( 類適配器 ) :
① 適配器 實現 用戶目標接口 : 適配器 需要實現 用戶目標接口 , 在實現的接口方法中 , 需要將實際操作 委托給 被適配者 ;
② 適配器 繼承 被適配者 : 如何調用到 被適配者 的方法呢 , 這里 適配器 通過 繼承 被適配者 , 獲取調用 被適配者 方法的資格 ;
③ 委托操作 : 在實現的 用戶目標接口中 , 通過 super 關鍵字 , 調用 被適配者 的方法實現具體功能 ;
類適配器 與 對象適配器 , 本質區別就是 適配器類訪問 被適配者的途徑 ;
類適配器 : 通過繼承 被適配器 , 獲取訪問被適配器方法的資格 ;
對象適配器 : 通過在其內部維護一個 被適配者 成員變量 , 進而通過該成員變量訪問 被適配者方法 ;
4 . 用戶訪問操作 :
① 定義目標接口變量 : 定義 用戶目標接口 對象變量 ;
② 目標接口變量賦值 : 創建 適配器對象 賦值給上述 用戶目標接口對象變量 , ( 適配器 是 用戶目標接口 的子類 ) ;
③ 目標接口調用 : 調用用戶目標接口 , 即可調用被適配者的實際功能方法 ;
VII . 適配器模式 ( 對象適配器 ) 代碼實現流程 ( 重點 )
1 . 明確被適配者 : 被適配者 是一個現有類 , 該類保持不變 ;
2 . 定義用戶目標接口 : 用戶通過調用該接口 , 實現實際的功能 , 該功能與適配者中的功能類似 , 但 接口不同 ;
3 . 聲明適配器 :
① 適配器 實現 用戶目標接口 : 適配器 需要實現 用戶目標接口 , 在實現的接口方法中 , 需要將實際操作 委托給 被適配者 ;
② 適配器 維護 被適配者 類型成員變量 : 如何調用到 被適配者 的方法呢 , 這里 適配器 通過 定義 被適配者 類型的成員變量 , 通過該 被適配者 類型成員變量 , 調用 被適配者 public 方法 ;
③ 委托操作 : 在實現的 用戶目標接口中 , 通過 被適配者類型 成員變量 , 調用 被適配者 的方法實現具體功能 ;
類適配器 與 對象適配器 , 本質區別就是 適配器類訪問 被適配者的途徑 ;
類適配器 : 通過繼承 被適配器 , 獲取訪問被適配器方法的資格 ;
對象適配器 : 通過在其內部維護一個 被適配者 成員變量 , 進而通過該成員變量訪問 被適配者方法 ;
4 . 用戶訪問操作 :
① 定義目標接口變量 : 定義 用戶目標接口 對象變量 ;
② 目標接口變量賦值 : 創建 適配器對象 賦值給上述 用戶目標接口對象變量 , ( 適配器 是 用戶目標接口 的子類 ) ;
③ 目標接口調用 : 調用用戶目標接口 , 即可調用被適配者的實際功能方法 ;
總結
以上是生活随笔為你收集整理的【设计模式】适配器模式 ( 概念 | 适用场景 | 优缺点 | 外观模式对比 | 适配器模式相关角色 | 类适配器 | 对象适配器 | 实现流程 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【设计模式】装饰者模式 ( 概念 | 适
- 下一篇: 【数据挖掘】数据挖掘简介 ( 数据挖掘引