Head First 設計模式之適配器模式與外觀模式(Java例子)

前言:

來源於《head first 設計模式》。當作讀書筆記了,這次看的是第7章適配器模式以及外觀模式。先從適配器模式再到外觀模式。

適配器模式的概念

將一個類的接口,轉換成客戶期望的另一個接口。適配器讓原本接口不兼容的類可以合作無限。

適配器模式的uml圖

在這裏插入圖片描述

  • Client:用戶類,使用新接口Target來完成某些特定的需求。
  • Target:新的接口類,開放特定接口request來完成某些特定操作。
  • Adaptee:被適配者,原有的類,即需要適配的類或適配者類。
  • Adapter:適配器類,將Adaptee中的接口封裝成Target中的新接口,來滿足用戶類的需求
    其實就是Client調用Adapter實例的操作,Adapter委託給Adaptee來完成這些被調用的操作。

例子:

還是鴨子。有個人想吃鴨子,但是呢我們沒有鴨子,只有火雞,我們想用火雞僞裝成鴨子來賣給他,然而火雞的接口不同,我們不能公然拿來冒充鴨子啊。那麼適配器就來了。

Duck接口—Target

public interface Duck {
	public void quack();
	public void fly();
}

開放quack fly方法來讓適配器適配

火雞接口

public interface Turkey {
	public void gobble();
	public void fly();
}

火雞類—Adaptee

public class WildTurkey implements Turkey {
	public void gobble() {
		System.out.println("Gobble gobble");
	}
 
	public void fly() {
		System.out.println("I'm flying a short distance");
	}
}

最終的執行者

適配器–adapter

public class TurkeyAdapter implements Duck {
	Turkey turkey;
 
	public TurkeyAdapter(Turkey turkey) {
		this.turkey = turkey;
	}
    
	public void quack() {
		turkey.gobble();
	}
  
	public void fly() {
		turkey.fly();
	}
}

採用組合的方式,將最終執行委託給火雞對象。

最終調用代碼—client

public class TurkeyTestDrive {
    public static void main(String[] args) {
        WildTurkey wildTurkey = new WildTurkey();
        Duck duckAdapter = new TurkeyAdapter(wildTurkey);
        System.out.println("The DuckAdapter says...");
        duckAdapter.quack();
        duckAdapter.fly();
    }
}

這裏就適配成功了,用戶調用的還是鴨子的quack方法以及fly方法,但其實背後實現的卻是一隻火雞。成功的偷龍轉鳳。適配器模式有一個好處就是如果一段時間後,我們的火雞有了新的接口,我們不需要修改客戶認知鴨子的方法,只需要修改適配器代碼即可。還有一個好處就是被適配者的任何子類都可以搭配者適配器使用,即火雞的子類綠毛火雞,也會被適配器適配成鴨子。

上述的是對象適配器,還有一種是類適配器,但是java無法實現噢,因爲其需要多繼承纔可以實現,書上是這樣說但是我覺得Target是接口啊,繼承adaptee然後實現Target接口不是衝突的。

在這裏插入圖片描述
兩者的不同之處在於類適配器繼承了Target與Adaptee。而對象適配器利用組合的方式將請求傳送給被適配者。

與其他設計模式的不同

裝飾者模式vs適配器模式
裝飾者:會拓展包裝類的行爲或者責任,而不是簡單的傳送
適配器:只是轉換接口調用,將任務委託給被適配者

外觀模式

外觀模式的概念

提供一個統一的接口,用來訪問子系統中的一羣接口。外觀定義了一個高層接口,讓子系統更容易使用

這個模式僅僅是提供了一層封裝,讓原本很多個步驟的工作簡化爲一步。舉個例子就是早上刷牙,有一下幾個步驟擠牙膏,刷牙齒,漱口。而人呢嫌太麻煩不想每次都需要寫三個方法,直接在大腦中把三個動作封裝成刷牙一個方法。刷牙包括了上述三個動作。即以後人只需要調用大腦的刷牙即可完成。
外觀模式不只是簡化了接口,也將客戶從組件的子系統中解耦出來。(即人可以不再管手擠牙膏,漱口。交給大腦來做了,只需調用刷牙方法)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章