Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3471404
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: Java

2009-04-01 18:56:41

您的电脑是个旧电脑,新的滑鼠都在使用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
阅读(826) | 评论(0) | 转发(0) |
0

上一篇:Buidler模式

下一篇:装饰模式

给主人留下些什么吧!~~