设计模式学习笔记之Adapter模式

本文介绍了一种软件设计模式——适配器模式,并通过Java示例代码详细展示了如何使用该模式解决新旧API不兼容的问题。具体案例为将新增的Iterator接口适配为旧版的Enumeration接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

您的电脑是个旧电脑,新的滑鼠都在使用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模式其实是通过实现接口来让客户端调用的方法传入子类,并让子类适配要在客户端调用的方法。所以向方法中传入参数一定要传入接口,这样才能保证以后可能通过适配器来作扩展。


事实(好的实例)和假设开始
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值