Adapter 模式 - Object Adapter

您的電腦是個舊電腦,新的滑鼠都在使用USB接口了,而您的電腦上並沒有USB,而只有一個PS2接口,這時您可以使用一個USB轉PS2的接頭作爲轉換,這樣您的電腦就可以使用新滑鼠了(當然您也可以使用USB擴充卡,意思是相同的)。

類似的概念,有時候您想在原來的程式中加入一個外部元件,例如一個類別,但是這個類別與您目前所設計的程式在介面上並不一致,爲了讓這個外部類與原程式的介面一致,您必須使用一個類別作爲中介來配接它們,這時您可以採用Adapter模式。

舉個例子來說,在Java 1.0中有個Enumeration,您在這個版本發行之後,使用它來設計了一個MessageApplication,例如:

  • MessageApplication.java
import java.util.*;

public class MessageApplication {
public void showAllMessage(Enumeration enum) {
Object msg;
while(enum.hasMoreElements()) {
msg = enum.nextElement();
System.out.println(msg);
}
}
}


您的客戶端程式是這麼使用MessageApplication的:

  • MessageClient.java
import java.util.*;

public class MessageClient {
private MessageApplication msgApp;

public void run() {
Vector vector = new Vector();
for(int i = 0; i < 10; i++)
vector.addElement("物件 " + i);

msgApp = new MessageApplication();
msgApp.showAllMessage(vector.elements());
}

public static void main(String[] args) {
MessageClient msgClient = new MessageClient();
msgClient.run();
}
}


現在Java 1.2中新增了Iterator,您想要使用它的功能,但基本上您不想更動原來程式中已設計好的MessageApplication類別,這時候您可以 使用Adapter模式,將Iterator的介面轉換爲Enumeration相容,例如:

  • IteratorAdapter.java
import java.util.*;

public class IteratorAdapter implements Enumeration {
private Iterator iterator;

IteratorAdapter(Iterator iterator) {
this.iterator = iterator;
}

// 轉接介面
public boolean hasMoreElements() {
return iterator.hasNext();
}

public Object nextElement()
throws NoSuchElementException {
return iterator.next();
}
}


您可以在客戶端程式中照樣使用MessageApplication類別,而不用作任何的變動:

  • MessageClient.java
import java.util.*;

public class MessageClient {
// We could still use MessageApplication
private Enumeration iteratorAdapter;

public void run() {
List arrayList = new ArrayList();

for(int i = 0; i < 10; i++)
arrayList.add("物件 " + i);

iteratorAdapter =
new IteratorAdapter(arrayList.iterator());
// We could still use MessageApplication
MessageApplication msgApp = new MessageApplication();
msgApp.showAllMessage(iteratorAdapter);
}

public static void main(String[] args) {
MessageClient msgClient = new MessageClient();
msgClient.run();
}
}

 

如程式所示的,透過Adapter模式,您原有程式中已設計好的類別不用更動,就可以引進新類別的功能,將上面的程式UML類別結構畫出如下:

Adapter


上面的作法,是將要引進的新類別當作Adapter類別的一個物件成員,這是IbObject Adapter模式,其抽象結構如下:

Adapter

 

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