Java設計模式(6):適配器模式

適配器模式的定義

適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。

適配器模式作爲兩個不兼容接口之間的橋樑。 這種類型的設計模式屬於結構模式,因爲該模式組合了兩個獨立接口。

這種模式涉及一個單獨的類,它負責連接獨立或不兼容接口的功能。

用電器做例子,筆記本電腦的插頭一般都是三相的,即除了陽極、陰極外,還有一個地極。而有些地方的電源插座卻只有兩極,沒有地極。電源插座與筆記本電腦的電源插頭不匹配使得筆記本電腦無法使用。這時候一個三相到兩相的轉換器(適配器)就能解決此問題,而這正像是本模式所做的事情。

適配就是由“源”到“目標”的適配,而當中鏈接兩者的關係就是適配器。它負責把“源”過度到“目標”。

舉個簡單的例子,比如有一個“源”是一個對象人,他擁有2種技能分別是說日語和說英語,而某個崗位(目標)需要你同時回說日語、英語、和法語,好了,現在我們的任務就是要將人這個“源”適配的這個崗位中,如何適配呢?顯而易見地我們需要爲人添加一個說法語的方法,這樣才能滿足目標的需要。

接着討論如何加說法語這個方法,也許你會說,爲什麼不直接在“源”中直接添加方法,我的理解是,適配是爲了實現某種目的而爲一個源類暫時性的加上某種方法,所以不能破壞原類的結構。同時不這麼做也符合Java的高內聚,低耦合的原理。既然不能直接加,接着我們就來說該怎麼來實現爲人這個“源”添加一個方法,而又不破壞“源”的本身結構。

模式所涉及的角色有:

在這裏插入圖片描述

1.目標(Target)角色:這就是所期待得到的接口。注意:由於這裏討論的是類適配器模式,因此目標不可以是類。

2.源(Adapee)角色:現在需要適配的接口。

3.適配器(Adaper)角色:適配器類是本模式的核心。適配器把源接口轉換成目標接口。顯然,這一角色不可以是接口,而必須是具體類。

適配器模式有2種,第一種是“面向類的適配器模式”,第二種是“面向對象的適配器模式”。

類適配器模式

這類適配器模式就是主要用於,單一的爲某個類而實現適配的這樣一種模式。

代碼實現:

//源:
 class Person {
        public void speakJapanese() {
            System.out.println("I can speak Japanese!");
        }

        public void speakEnglish() {
            System.out.println("I can speak English!");
        }
    }

//目標:
    interface Target {
        void speakJapanese();

        void speakEnglish();

        void speakFrench();
    }

//適配器:
    class Adapter extends Person implements Target {

        @Override
        public void speakFrench() {

        }
    }

爲什麼稱其爲類適配模式呢?很顯然的,Adapter類繼承了Person類,而在Java這種單繼承的語言中也就意味着,他不可能再去繼承其他的類了,這樣也就是這個適配器只爲Person這一個類服務。所以稱其爲類適配模式。

對象適配器模式

對象適配器模式是把“源”作爲一個對象聚合到適配器類中。

   class Person {
        public void speakJapanese() {
            System.out.println("I can speak Japanese!");
        }

        public void speakEnglish() {
            System.out.println("I can speak English!");
        }
    }

    interface Target {
        void speakJapanese();

        void speakEnglish();

        void speakFrench();
    }

    class Adapter implements Target {

        Person mPerson;

        public Adapter(Person person) {
            this.mPerson = person;
        }

        @Override
        public void speakJapanese() {
			 mPerson.speakJapanese();
        }

        @Override
        public void speakEnglish() {
			 mPerson.speakEnglish();
        }

        @Override
        public void speakFrench() {

        }
    }

對象的適配器模式,把“源”作爲一個構造參數傳入適配器,然後執行接口所要求的方法。這種適配模式可以爲多個源進行適配。彌補了類適配模式的不足。

現在來對2種適配模式做個分析:

1.類的適配模式用於單一源的適配,由於它的源的單一話,代碼實現不用寫選擇邏輯,很清晰;而對象的適配模式則可用於多源的適配,彌補了類適配模式的不足,使得原本用類適配模式需要寫很多適配器的情況不復存在,弱點是,由於源的數目可以較多,所以具體的實現條件選擇分支比較多,不太清晰。

2.適配器模式主要用於幾種情況:(1)系統需要使用現有的類,但現有的類不完全符合需要。(2)講彼此沒有太大關聯的類引進來一起完成某項工作(指對象適配)。

接口適配器模式(缺省適配模式)

這種模式的核心歸結如下:當你想實現一個接口但又不想實現所有接口方法,只想去實現一部分方法時,就用中默認的適配器模式,他的方法是在接口和具體實現類中添加一個抽象類,而用抽象類去空實現目標接口的所有方法。而具體的實現類只需要覆蓋其需要完成的方法即可。代碼如下:

public interface Job {
	
	public abstract void speakJapanese();
	public abstract void speakEnglish();
	public abstract void speakFrench();
	public abstract void speakChinese();
	
}

public abstract class JobDefault implements Job{

	public void speakChinese() {
		
	}

	public void speakEnglish() {
		
	}

	public void speakFrench() {
		
	}

	public void speakJapanese() {
		
	}

}

public class JobImpl extends JobDefault{
	
	public void speakChinese(){
		System.out.println("I can speak Chinese!");
	}
	
}

適配器模式的優缺點

優點

  1. 更好的複用性:系統需要使用現有的類,而此類的接口不符合系統的需要。那麼通過適配器模式就可以讓這些功能得到更好的複用。
  2. 更好的擴展性:在實現適配器功能的時候,可以擴展自己源的行爲(增加方法),從而自然地擴展系統的功能。
  3. 完美實現解耦,通過增加適配器類將適配者與目標接口聯繫起來,無需修改原有實現;
  4. 符合開閉原則

缺點

會導致系統紊亂:濫用適配器,會讓系統變得非常零亂。例如,明明看到調用的是A接口,其實內部被適配成了B接口的實現,一個系統如果太多出現這種情況,無異於一場災難。因此如果不是很有必要,可以不使用適配器,而是直接對系統進行重構。

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