Java 设计模式之适配器模式
一、了解適配器模式
1.1 什么是適配器模式
適配器模式將一個類的接口,轉換成客戶期望的另一個接口。適配器讓原來接口不兼容的類可以合作無間。適配器模式有兩種:“對象”適配器和“類”適配器。
這個模式可以通過創建適配器進行接口轉換,讓不兼容的接口變得兼容。這可以讓客戶從實現的接口解耦。如果在一段時間之后,我們想要改變接口,適配器可以將改變的部分封裝起來,客戶就不必為了應對不同的接口而每次跟著修改。
1.2 適配器模式組成結構
- 客戶 (Client):客戶類。
- 目標接口(Target):客戶所期待的接口。目標可以是具體的或抽象的類,也可以是接口。
- 適配者(Adaptee):需要適配的類或適配者類。
- 適配器(Adapter):通過包裝一個需要適配的對象,把原接口轉換成目標接口。
1.3 適配器模式 UML 圖解
(1)“對象”適配器
這個適配器模式充滿著良好的 OO 設計原則:使用對象組合,以修改的接口包裝備被適配者;這樣做還有一個優點:那就是被適配者的任何子類,都可以搭配著適配器使用。
(2)“類”適配器
看起來“類”適配器和“對象”適配器很類似,唯一的差別就是 Adapter 繼承了 Target 與 Adaptee。所以“類”適配器必須要使用多重繼承才能實現,在 Java 中這是不可能的。所以這里我們主要介紹“對象”適配器。
1.4 適配器模式應用場景
- 系統需要使用現有的類,而這些類的接口不符合系統的需要。
- 想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。
- 需要一個統一的輸出接口,而輸入端的類型不可預知。
二、適配器模式具體應用
2.1 問題描述
以假亂真:如果它走起路來像一只鴨子,叫起來像一只鴨子。那么它可能是一只包裝了鴨子類適配器的火雞。
現在你有一個鴨子 (Duck) 接口,一個火雞 (Turkey) 接口。想讓你創建一個鴨子對象,但是現在你只有一只火雞,怎么辦呢?于是你想到用這只火雞來假扮鴨子。
2.2 代碼實現 (“對象”適配器模式)
目標鴨子 (Duck) 接口
package com.jas.adapter;/*** 鴨子接口中定義了抽象兩個方法,分別是,鴨子“呱呱叫”和鴨子會飛*/ public interface Duck {void quack();void fly(); }火雞 (Turkey) 接口
package com.jas.adapter;/*** 火雞接口中定義了兩個抽象方法,分別是火雞“咯咯叫”和火雞會飛*/ public interface Turkey {void gobble();void fly(); }野生火雞 (WildTurkey) 類
package com.jas.adapter;/*** 實現了 Turkey 接口中的兩個方法*/ public class WildTurkey implements Turkey {@Overridepublic void gobble() {System.out.println("Gobble gobble!");}@Overridepublic void fly() {System.out.println("I'm flying a short distance!");} }適配器 TurkeyAdapter 類
package com.jas.adapter;/*** 適配器類,實現了 Duck 接口,目的將火雞轉換成鴨子,以假亂真*/ public class TurkeyAdapter implements Duck {Turkey turkey;/*** 通過構造方法,獲得適配對象實例化的引用* * @param turkey 適配者對象*/public TurkeyAdapter(Turkey turkey){this.turkey = turkey;}@Overridepublic void quack() {turkey.gobble();}@Overridepublic void fly() {// 由于火雞的飛行距離較鴨子近,為了偽裝成鴨子,所以讓它飛三次來對應鴨子的飛行距離for (int i = 0; i < 3; i++) {turkey.fly();}} }測試 DuckTestDrive 類
package com.jas.adapter;public class DuckTestDrive {public static void main(String[] args) {WildTurkey wildTurkey = new WildTurkey();// 將火雞包裝進一個火雞適配器中,使它看起來像一只鴨子TurkeyAdapter turkeyAdapter = new TurkeyAdapter(wildTurkey); System.out.println("\nThe TurkeyAdapter says ...");turkeyAdapter.quack();turkeyAdapter.fly();} }/*** 輸出 * The TurkeyAdapter says ...* Gobble gobble!* I'm flying a short distance!* I'm flying a short distance!* I'm flying a short distance!* */三、適配器模式總結
- 適配器將一個對象包裝起來用以改變其接口。
- 當需要使用一個現有的類而其接口并不符合你的需求時,可以使用適配器。
- 實現一個適配器可能會花一番功夫,可能也會毫不費力,原因是有其目標接口的大小與復雜度決定。
- 適配器模式有兩種形式:“類”適配器與“對象適配器”,類適配器需要使用到多重繼承,所以在 Java 中并不適用。
PS:點擊了解更多設計模式 http://blog.csdn.net/codejas/article/details/79236013
參考文獻
《Head First 設計模式》
總結
以上是生活随笔為你收集整理的Java 设计模式之适配器模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年12月28号出生的女孩取什么名
- 下一篇: m开头的姓氏