標籤:

結構型模式之適配器模式

結構型模式之適配器模式

定義

  • 適配器模式用於將一個介面轉化成客戶想要的另一個介面,使介面不兼容的那些類可以一起工作,其別名為包裝器(Wrapper)。適配器模式既可以作為類結構型模式,也可以作為對象結構型模式。

  • Target(目標抽象類):目標抽象類定義客戶所需介面,可以是一個抽象類或介面,也可以是具體類。
  • Adapter(適配器類):適配器可以調用另一個介面,作為一個轉換器,對Adaptee和Target進行適配,適配器類是適配器模式的核心,在對象適配器中,它通過繼承Target並關聯一個Adaptee對象使二者產生聯繫。
  • Adaptee(適配者類):適配者即被適配的角色,它定義了一個已經存在的介面,這個介面需要適配,適配者類一般是一個具體類,包含了客戶希望使用的業務方法,在某些情況下可能沒有適配者類的源代碼。
  • 根據對象適配器模式結構圖,在對象適配器中,客戶端需要調用request()方法,而適配者類Adaptee沒有該方法,但是它所提供的specificRequest()方法卻是客戶端所需要的。為了使客戶端能夠使用適配者類,需要提供一個包裝類Adapter,即適配器類。這個包裝類包裝了一個適配者的實例,從而將客戶端與適配者銜接起來,在適配器的request()方法中調用適配者的specificRequest()方法。因為適配器類與適配者類是關聯關係(也可稱之為委派關係),所以這種適配器模式稱為對象適配器模式

類適配器

  • 類適配器是繼承適配者類實現的,其中對象適配器是使用組合的方式實現的,就是適配者類作為適配器類的成員變數而實現的
  • 一般目標抽象類是一個介面,適配者類一般是一個具體的實現類,有時候甚至不知道其中的源代碼,因此需要適配器類將適配者類轉換成適合用戶的目標類

實例

  • 我們知道筆記本充電的電壓是5v,但是我們的高壓電是220v,那麼我們此時就需要一個適配器將這個220v電壓轉換成為5v的電壓給筆記本充電
    • 這裡的220v電壓就是適配者類,即是需要轉換的類
    • 5v電壓是目標抽象類,由適配器將220v轉換而來
    • 這裡的適配器類的主要功能就是將220v電壓轉換成5v電壓
  • 目標介面(5v電壓)

/* * 介面為5v電壓的介面 , 這個目標抽象類 */public interface Power5 { void getPower5();}

  • 220v電壓的類(這裡是一個具體的類,適配者類)

public class Power220 { public void getPower220(){ System.out.println("正在輸出220v電壓....."); }}

  • 適配器類(將220v電壓轉換成5v)

/* * 適配器類,主要的目的就是將220v電壓轉換為5v的電壓供筆記本充電 * 其中Power5是目標抽象介面,是最終需要的介面,Power220是一個適配者類,是已經存在的,只需要適配器轉換即可 */public class AdapterPower5 extends Power220 implements Power5 { /** * 重載Power5中的方法,獲取需要的5v電壓 * 過程: 先獲取220v電壓,然後進行轉換即可 * */ @Override public void getPower5() { super.getPower220(); //首先獲取220v電壓 this.transform(); //將220v電壓轉換成5v的電壓 System.out.println("獲取5v電壓......."); } /* * 將220v電壓轉換成5v電壓的方法 */ public void transform() { System.out.println("現在將220v電壓轉換成5v電壓......."); }}

  • 筆記本充電的類

/* * 筆記本類 */public class NoteBook { /** * 筆記本充電的方法 * @param power5 電壓為5v的對象 */ public void PowerOn(Power5 power5){ power5.getPower5(); //獲取5v電壓 System.out.println("筆記本獲取了5v的電壓,正在開始充電......"); }}

  • 測試類

public class Client { public static void main(String[] args) { NoteBook noteBook=new NoteBook(); //創建筆記本的類 noteBook.PowerOn(new AdapterPower5()); //調用筆記本充電的類 }}

對象適配器

  • 對象適配器是將適配者類作為適配器類的成員變數並不是繼承,這個是一種組合方式
  • 這種方式使用的更加普遍

實例

  • 這裡的實例還是前面的例子
  • 這裡唯一不同的就是適配器類,不是繼承適配者類,而是使用組合的方式

/* * 適配器類,這個是對象適配器,適配者類是作為成員變數存在,是組合關係 */public class Adapter implements Power5 { private Power220 power; //220v電壓類的對象,作為成員變數 /* * 構造方法,主要是為類初始化Power220v的對象 */ public Adapter(Power220 power){ this.power=power; } @Override public void getPower5() { power.getPower220(); //獲取220v電壓 transform(); //轉換電壓 System.out.println("正在輸出5v電壓......."); } public void transform(){ System.out.println("將220v電壓轉換成5v的電壓......"); }}

總結

  • 類適配器是使用類繼承的方式,適配器類繼承適配者類(不提倡使用)
  • 對象適配器使用的是一種組合的方式,將適配者類作為其中的成員變數,那麼也是可以實現(提倡使用)

推薦閱讀:

類的設計原則
創建型模式之建造者模式
遊戲開發與程序設計知識總結01——設計模式
設計模式之「Decorator」註疏#02

TAG:設計模式 |