【设计模式】适配器模式 ( 类适配器代码模板 | 对象适配器代码模板 | 适配器模式示例 )
文章目錄
- I . 適配器模式 ( 類適配器 ) 代碼模板
- II . 適配器模式 ( 對象適配器 ) 代碼模板
- III . 適配器模式 代碼示例
I . 適配器模式 ( 類適配器 ) 代碼模板
1 . 明確被適配者 : 被適配者 是一個現(xiàn)有類 , 該類保持不變 ;
① 現(xiàn)有類 : 實際開發(fā)時, 該類并不需要定義 , 這里給出示例 ;
② 調(diào)用行為 : 最終的用戶目標接口 , 是要調(diào)用 Adaptee 類對象的 adapteeFunction 方法 ;
package kim.hsl.design.adapter.classadapter;/*** 被適配者 : 現(xiàn)有的功能類* 提供實際的功能, 及實現(xiàn)相關操作** 這是被調(diào)用的現(xiàn)有類 , 但是不能使用 adapteeRequest 方法* 要使用用戶 TargetInterface 接口的 request 方法*/ public class Adaptee {public void adapteeFunction(){System.out.println("類適配器測試 : 被適配者方法");} }
2 . 定義用戶目標接口 : 用戶通過調(diào)用該接口 , 實現(xiàn)實際的功能 , 該功能與適配者中的功能類似 , 但 接口不同 ;
① 用戶調(diào)用 : 最終用戶調(diào)用方法時 , 會創(chuàng)建 TargetInterface 接口子類類對象 , 并調(diào)用其中的 userCall 方法 ;
② 實現(xiàn)途徑 : 在一個第三方類中 , 實現(xiàn)該 TargetInterface 接口 , 重寫 userCall 方法 , 在該方法中調(diào)用 Adaptee 的 adapteeFunction 方法 ; ( 這個第三方類 , 就是適配器 )
package kim.hsl.design.adapter.classadapter;/*** 目標接口* 用戶調(diào)用的是該接口的 userCall 方法** 注意 : 適配器需要實現(xiàn)目標接口*/ public interface TargetInterface {//用戶調(diào)用的方法void userCall(); }
3 . 聲明適配器 ( 類適配器 ) :
① 適配器 實現(xiàn) 用戶目標接口 : 適配器 需要實現(xiàn) 用戶目標接口 , 在實現(xiàn)的接口方法中 , 需要將實際操作 委托給 被適配者 ;
② 適配器 實現(xiàn) 用戶目標接口 代碼實現(xiàn)說明 :此處 Adapter 適配器類 , 實現(xiàn)了 TargetInterface 接口 , 并實現(xiàn)了 userCall 方法 , 目的是為了讓用戶有可調(diào)用的接口 ;
③ 適配器 繼承 被適配者 : 如何調(diào)用到 被適配者 的方法呢 , 這里 適配器 通過 繼承 被適配者 , 獲取調(diào)用 被適配者 方法的資格 ;
④ 適配器 繼承 被適配者 代碼實現(xiàn)說明 :Adapter 適配器繼承了 Adaptee 被適配者 , 目的是為了獲取調(diào)用 Adaptee 父類的 adapteeFunction 方法 ;
⑤ 委托操作 : 在實現(xiàn)的 用戶目標接口中 , 通過 super 關鍵字 , 調(diào)用 被適配者 的方法實現(xiàn)具體功能 ;
⑥ 委托操作代碼實現(xiàn)說明 : 在 TargetInterface 接口的 userCall 方法中 , 調(diào)用 Adaptee 父類的 adapteeFunction 方法 , 這樣就可以在不用修改代碼的情況下 , 讓用戶可以通過創(chuàng)建 TargetInterface 接口對象 , 調(diào)用 userCall 方法 , 從而間接調(diào)用到 Adaptee 類的 adapteeFunction 方法 ;
package kim.hsl.design.adapter.classadapter;/*** 適配器類** 適配器類 繼承了 被適配者 類, 目的是為了訪問其 adapteeFunction 函數(shù)* 同時其實現(xiàn)了 TargetInterface 接口 , 在 重寫的 userCall 方法中 ,* 調(diào)用 Adaptee 父類的 adapteeFunction 方法 , 將實際的操作委托給了父類方法*/ public class Adapter extends Adaptee implements TargetInterface {@Overridepublic void userCall() {//將父類 Adaptee 的 request 方法適配給了 TargetInterface 接口super.adapteeFunction();} }
類適配器 與 對象適配器 , 本質(zhì)區(qū)別就是 適配器類訪問 被適配者的途徑 ;
類適配器 : 通過繼承 被適配器 , 獲取訪問被適配器方法的資格 ;
對象適配器 : 通過在其內(nèi)部維護一個 被適配者 成員變量 , 進而通過該成員變量訪問 被適配者方法 ;
4 . 用戶訪問操作 :
① 定義目標接口變量 : 定義 用戶目標接口 對象變量 ; 用戶定義 TargetInterface 類型變量 , 為其賦值適配器對象 Adapter 類對象作為其變量值 ;
② 目標接口變量賦值 : 創(chuàng)建 適配器對象 賦值給上述 用戶目標接口對象變量 , ( 適配器 是 用戶目標接口 的子類 ) ;
③ 目標接口調(diào)用 : 調(diào)用用戶目標接口 , 即可調(diào)用被適配者的實際功能方法 ; 用戶直接調(diào)用 TargetInterface 接口的 userCall 方法 , 實際上被適配器委托給了 Adaptee 的 adapteeFunction 方法 ;
package kim.hsl.design.adapter.classadapter;public class Main {public static void main(String[] args) {//用戶創(chuàng)建的類時 目標接口 類型對象//但創(chuàng)建對象時 , 創(chuàng)建的是適配器對象//適配器對象 實現(xiàn)了 TargetInterface 接口 , Adapter 是 TargetInterface 子類//適配器中重寫的 userCall 方法實際上委托給了 Adaptee 被適配者對象 成員TargetInterface targetInterface = new Adapter();targetInterface.userCall();} }執(zhí)行結(jié)果 :
類適配器測試 : 被適配者方法II . 適配器模式 ( 對象適配器 ) 代碼模板
1 . 明確被適配者 : 被適配者 是一個現(xiàn)有類 , 該類保持不變 ;
① 現(xiàn)有類 : 實際開發(fā)時, 該類并不需要定義 , 這里給出示例 ;
② 調(diào)用行為 : 最終的用戶目標接口 , 是要調(diào)用 Adaptee 類對象的 adapteeFunction 方法 ;
package kim.hsl.design.adapter.objectdapter;/*** 被適配者 : 現(xiàn)有的功能類* 提供實際的功能, 及實現(xiàn)相關操作** 這是被調(diào)用的現(xiàn)有類 , 但是不能使用 adapteeRequest 方法* 要使用用戶 TargetInterface 接口的 request 方法*/ public class Adaptee {public void adapteeFunction(){System.out.println("對象適配器測試 : 被適配者方法");} }
2 . 定義用戶目標接口 : 用戶通過調(diào)用該接口 , 實現(xiàn)實際的功能 , 該功能與適配者中的功能類似 , 但 接口不同 ;
① 用戶調(diào)用 : 最終用戶調(diào)用方法時 , 會創(chuàng)建 TargetInterface 接口子類類對象 , 并調(diào)用其中的 userCall 方法 ;
② 實現(xiàn)途徑 : 在一個第三方類中 , 實現(xiàn)該 TargetInterface 接口 , 重寫 userCall 方法 , 在該方法中調(diào)用 Adaptee 的 adapteeFunction 方法 ; ( 這個第三方類 , 就是適配器 )
package kim.hsl.design.adapter.objectdapter;/*** 目標接口* 用戶調(diào)用的是該接口的 userCall 方法** 注意 : 適配器需要實現(xiàn)目標接口*/ public interface TargetInterface {//用戶調(diào)用的方法void userCall(); }
3 . 聲明適配器 ( 類適配器 ) :
① 適配器 實現(xiàn) 用戶目標接口 : 適配器 需要實現(xiàn) 用戶目標接口 , 在實現(xiàn)的接口方法中 , 需要將實際操作 委托給 被適配者 ;
② 適配器 實現(xiàn) 用戶目標接口 代碼實現(xiàn)說明 :此處 Adapter 適配器類 , 實現(xiàn)了 TargetInterface 接口 , 并實現(xiàn)了 userCall 方法 , 目的是為了讓用戶有可調(diào)用的接口 ;
③ 適配器 維護 被適配者 類型成員變量 : 如何調(diào)用到 被適配者 的方法呢 , 這里 適配器 通過 定義 被適配者 類型的成員變量 , 通過該 被適配者 類型成員變量 , 調(diào)用 被適配者 public 方法 ;
④ 適配器 維護 被適配者 類型成員變量 代碼實現(xiàn)說明 :Adapter 適配器中定義了一個 Adaptee 被適配者成員變量 , 目的是為了通過該成員變量 , 調(diào)用 Adaptee 的 adapteeFunction 方法 ;
⑤ 委托操作 : 在實現(xiàn)的 用戶目標接口中 , 通過 super 關鍵字 , 調(diào)用 被適配者 的方法實現(xiàn)具體功能 ;
⑥ 委托操作代碼實現(xiàn)說明 : 在 TargetInterface 接口的 userCall 方法中 , 調(diào)用 Adaptee 父類的 adapteeFunction 方法 , 這樣就可以在不用修改代碼的情況下 , 讓用戶可以通過創(chuàng)建 TargetInterface 接口對象 , 調(diào)用 userCall 方法 , 從而間接調(diào)用到 Adaptee 類的 adapteeFunction 方法 ;
package kim.hsl.design.adapter.objectdapter;/*** 適配器類** 適配器類 維護了一個 被適配者的對象 Adaptee 成員變量* 同時又實現(xiàn)了目標接口 TargetInterface* 當用戶調(diào)用 TargetInterface 接口的 userCall 方法時* 將實際的操作委托給 Adaptee 接口的 adapteeFunction 方法*/ public class Adapter implements TargetInterface {//通過維護成員變量的方式 , 將 TargetInterface 接口的 request 方法// 委托給 Adaptee 接口的 adapteeRequest 方法private Adaptee adaptee = new Adaptee();@Overridepublic void userCall() {//將父類 Adaptee 的 request 方法適配給了 TargetInterface 接口adaptee.adapteeFunction();} }
類適配器 與 對象適配器 , 本質(zhì)區(qū)別就是 適配器類訪問 被適配者的途徑 ;
類適配器 : 通過繼承 被適配器 , 獲取訪問被適配器方法的資格 ;
對象適配器 : 通過在其內(nèi)部維護一個 被適配者 成員變量 , 進而通過該成員變量訪問 被適配者方法 ;
4 . 用戶訪問操作 :
① 定義目標接口變量 : 定義 用戶目標接口 對象變量 ; 用戶定義 TargetInterface 類型變量 , 為其賦值適配器對象 Adapter 類對象作為其變量值 ;
② 目標接口變量賦值 : 創(chuàng)建 適配器對象 賦值給上述 用戶目標接口對象變量 , ( 適配器 是 用戶目標接口 的子類 ) ;
③ 目標接口調(diào)用 : 調(diào)用用戶目標接口 , 即可調(diào)用被適配者的實際功能方法 ; 用戶直接調(diào)用 TargetInterface 接口的 userCall 方法 , 實際上被適配器委托給了 Adaptee 的 adapteeFunction 方法 ;
package kim.hsl.design.adapter.objectdapter;public class Main {public static void main(String[] args) {//用戶創(chuàng)建的類時 目標接口 類型對象//但創(chuàng)建對象時 , 創(chuàng)建的是適配器對象//適配器對象 實現(xiàn)了 TargetInterface 接口 , Adapter 是 Target 子類//適配器中重寫的 userCall 方法實際上委托給了 Adaptee 被適配者對象 成員TargetInterface target = new Adapter();target.userCall();} }
執(zhí)行結(jié)果 :
對象適配器測試 : 被適配者方法III . 適配器模式 代碼示例
1 . 需求描述 : 家庭中的插座提供 220 V 電壓 , 手機需要使用 5V 電壓進行充電 ;
2 . 適配器模式建模 :
① 被適配者 : 家庭中提供的 220 V 電壓 ;
② 用戶調(diào)用接口 : 手機使用 5 V 電壓充電 ;
③ 適配器 : 將家庭的 220 V 電壓轉(zhuǎn)為手機充電的 5 V 電壓 ;
3 . 被適配者 : 家庭電壓 220 V ; HomePower220V 類提供原本的功能 ; 最終用戶的目標接口調(diào)用的是該類的 power220V 方法 ;
package kim.hsl.design.adapter.demo;/*** 被適配者* 代表 220V 電壓*/ public class HomePower220V {public int power220V(){System.out.println("輸出 220V 電壓");return 220;} }4 . 用戶接口 : 手機使用 5 V 電壓充電 , 最終使用的電壓是 5V ; 調(diào)用 HomePower220V 的 power220V 方法 , 接口不同 , 需要使用適配器轉(zhuǎn)換 ;
package kim.hsl.design.adapter.demo;/*** 目標接口 : 手機充電器* 輸出 5V 電壓*/ public interface PhoneCharge {int power5V(); }5 . 適配器 : 將家庭的 220 V 輸出電壓 , 轉(zhuǎn)為輸出 5 V 電壓 ;
① 實現(xiàn)接口 : 適配器 Adapter 實現(xiàn) PhoneCharge 接口 , 實現(xiàn) power5V 方法 ;
② 維護成員變量 : 在適配器中維護 HomePower220V 成員變量 , 在 power5V 方法中調(diào)用 HomePower220V 類的 power220V 方法 ;
③ 目的 : 達到了適配 被適配者 HomePower220V 和 用戶目標接口 PhoneCharge 的接口適配 ;
package kim.hsl.design.adapter.demo;/*** 適配器* 輸入 220V 電壓, 輸出 5V 電壓*/ public class Adapter implements PhoneCharge {private HomePower220V ac220V = new HomePower220V();@Overridepublic int power5V() {int input = ac220V.power220V();//將 220 V 處理成 5VSystem.out.println("220V 轉(zhuǎn)為 5V 電壓");return 5;} }6 . 用戶接口調(diào)用 :
① 用戶行為 : 用戶方創(chuàng)建 PhoneCharge 接口對象 , 將適配器對象賦值給該 PhoneCharge 接口變量 , 調(diào)用時調(diào)用 PhoneCharge 接口的 power5V 方法 ,
② 委托操作 : 適配器中實現(xiàn)的 power5V 方法 , 實際被委托給了 HomePower220V 被適配者的 power220V 方法 ;
package kim.hsl.design.adapter.demo;public class Main {public static void main(String[] args) {PhoneCharge phoneCharge = new Adapter();phoneCharge.power5V();} }執(zhí)行結(jié)果 :
輸出 220V 電壓 220V 轉(zhuǎn)為 5V 電壓總結(jié)
以上是生活随笔為你收集整理的【设计模式】适配器模式 ( 类适配器代码模板 | 对象适配器代码模板 | 适配器模式示例 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据挖掘】数据挖掘简介 ( 数据挖掘引
- 下一篇: 【数据挖掘】数据挖掘简介 ( 6 个常用