Java Adapter 介面卡模式(類介面卡,物件介面卡)優缺點對比
介面卡模式就是把一個類的介面轉換成客戶端所期待的另外一種介面,從而使原介面不匹配而無法在一起工作的的兩個類能在一起工作。從功能上說,這些介面不相容的類一般具有相同或相似的功能。通常我們通過修改該類的介面來解決這種介面不相容的情形,但是如果我們不願意為了一個應用而修改各原介面,或者我們壓根兒就沒有物件的原始碼的時候,介面卡模式就會派上用場了。
介面卡的優點:
1、將目標類和適配者類解耦
2、增加了類的透明性和複用性,將具體的實現封裝在適配者類中,對於客戶端類來說是透明的,而且提高了適配者的複用性
3、靈活性和擴充套件性都非常好,符合開閉原則
介面卡所涉及的角色包括下面幾種:
目標(Target):定義一個客戶端使用的特定介面。
客戶端(Client):使用目標介面,與和目標介面一致的物件合作。
被適配者(Adaptee):一個現存需要適配的介面。
介面卡(Adapter):負責將Adaptee的介面轉換為Target的介面。介面卡是一個具體的類,這是該模式的核心。
介面卡分為類介面卡和物件介面卡兩種,下面將詳細講述。
類介面卡
所謂類介面卡,指的是介面卡Adapter繼承我們的被適配者Adaptee,並實現目標介面Target。由於Java中是單繼承,所以這個介面卡僅僅只能服務於所繼承的被適配者Adaptee。程式碼如下:
被適配者(Adaptee)
public class Person {
private int id;
private String name;
/**
* person可以現在只能說英語
*/
public void sayEnglish(){
System.out.println("Person can say english!");
}
/**
* 省略setter,getter.
*/
}
目標介面(Target)
/**
* 目標要求person可以說英語,法語,日語.但是現在的person僅僅可以說英語
* @author Administrator
*
*/
public interface Target_Person {
void sayEnglish();
void sayFrench();
void sayJapanese();
}
介面卡(Adapter)
package com.bluemsun.classadapter;
/**
* 類介面卡,因為繼承了Person,而Java中只能單繼承,所以這個介面卡只為person這一個類服務
* 這個介面卡就讓person類在不修改原始碼的基礎上能實現目標介面所指定的方法
* @author Administrator
*
*/
public class Adapter_Person extends Person implements Target_Person{
@Override
public void sayFrench() {
System.out.println("Person can say French!");
}
@Override
public void sayJapanese() {
System.out.println("Person can say Japanese!");
}
}
客戶端(Client)
public class Test {
public static void main(String[] args) {
Target_Person person = new Adapter_Person();
person.sayEnglish();
person.sayFrench();
person.sayJapanese();
}
}
上面的幾段簡單程式碼演示了類介面卡的作用。正如我們開始所言,這個介面卡Adapter只能為Person這一個類所服務。這時候你可能會想,要是我所需要適配的類很多,是不是都需要為每一個需要適配的類寫一個Adapter?有沒有更加靈活的方式呢?答案是:有!就是我們下面所講的物件介面卡。
物件介面卡
所謂物件介面卡,簡單的說就是介面卡實現我們的目標介面,但是並不繼承需要被適配的類。而是通過在介面卡的建構函式中將需要被適配的類傳遞進來從而進行適配。程式碼如下:(Target,Adaptee同上)
介面卡(Adapter)
import com.bluemsun.classadapter.Person;
import com.bluemsun.classadapter.Target_Person;
/**
* 物件介面卡,與類介面卡不同的是:物件介面卡可以適配多個源到目標
* @author Administrator
*
*/
public class Adapter_Person implements Target_Person{ //僅僅實現目標介面
private Person person;
//在建構函式中將Adaptee類Person傳遞進來
public Adapter_Person(Person person){
this.person = person;
}
//實現目標介面中的sayEnglish()--呼叫Adaptee中的sayEnglish()
@Override
public void sayEnglish() {
this.person.sayEnglish();
}
//實現介面中的其它方法
@Override
public void sayFrench() {
System.out.println("person can say French!");
}
@Override
public void sayJapanese() {
System.out.println("person can say Japanese!");
}
}
客戶端(Client)
mport com.bluemsun.classadapter.Person;
import com.bluemsun.classadapter.Target_Person;
public class Test {
public static void main(String[] args) {
Target_Person person = new Adapter_Person(new Person());
person.sayEnglish();
person.sayFrench();
person.sayJapanese();
}
}
物件介面卡可以適配多個帶適配的類。只需要你在Adapter的構造方法中傳遞不同的帶適配的類即可。具有靈活性。
類介面卡的優點:
1、由於介面卡類是適配者類的子類,因此可以再介面卡類中置換一些適配者的方法,使得介面卡的靈活性更強。
類介面卡的缺點:
1、對於Java、C#等不支援多重繼承的語言,一次最多隻能適配一個適配者類,而且目標抽象類只能為介面,不能為類,其使用有一定的侷限性,不能將一個適配者類和他的子類同時適配到目標介面。
物件介面卡的優點:
1、把多個不同的適配者適配到同一個目標,也就是說,同一個介面卡可以把適配者類和他的子類都適配到目標介面。
物件介面卡的缺點:
1、與類介面卡模式相比,要想置換適配者類的方法就不容易。