結構型模式之適配器模式
結構型模式之適配器模式
定義
- 適配器模式用於將一個介面轉化成客戶想要的另一個介面,使介面不兼容的那些類可以一起工作,其別名為包裝器(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:設計模式 |