博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java设计模式之适配器模式(Adapter Pattern)
阅读量:7240 次
发布时间:2019-06-29

本文共 2145 字,大约阅读时间需要 7 分钟。

Adapter Pattern的作用是在不改变功能的前提下转换接口。Adapter分为两类,一类是Object Adapter, 还有一类是Class Adapter。因为Class Adapter的实现须要用到多继承,而Java不支持多继承,所以这里仅仅关注Object Adapter。

在JDK1.5之前是没有 java.util.Iterator 接口的,java.util.Enumeration 接口起着 Iterator 的作用。那么假设我们须要维护一些年代比較久远的代码,可能就会面临着没有 Iterator 的窘境。这时候 Adapter Pattern 就派上用场了。以下通过两个样例,说明怎样通过 Adapter Pattern 将 Enumeration 接口与 Iterator 接口相互“转换”。

老代码适配新代码:将Enumeration转换为Iterator

查了一下API文档,发现 StringTokenizer 这个类实现了 Enumeration 接口,那就拿这个来举例吧。如今有需求,须要用 Iterator 的方式来"遍历" StringTokenizer,可是 StringTokenizer类并没有实现 Iterator 接口。因此我们须要编写一个 Adapter,将 Enumeration 接口转换成 Iterator 接口。
class IteratorAdapter implements Iterator {	private Enumeration enume; // 保存 Enumeration 接口实现类		public IteratorAdapter(Enumeration enume) {		this.enume = enume;	}	/**	 * Enumeartion的hasMoreElements()方法与Iterator的hasNext()方法功能同样,直接调用	 */	@Override	public boolean hasNext() {		return enume.hasMoreElements();	}	/**	 * Enumeration的next()方法与Iterator的next()方法功能同样,直接调用	 */	@Override	public Object next() {		return enume.nextElement();	}	/**	 * 因为Enumeration接口中没有此方法,所以扔异常	 */	@Override	public void remove() {		throw new UnsupportedOperationException();			}	}
能够看到,我们实际上仅仅是把没有实现的 Iterator 接口里的方法实现托付给了 Enumeration 接口的实现。
Adapter 的用法例如以下:
StringTokenizer st = new StringTokenizer("a b c d e f g");				// 创建adapter对象,将StringTokenizer对象传进去		IteratorAdapter strTokenAdapter = new IteratorAdapter(st);				// 这时候就能够用Iterator的方式遍历没有实现Iterator接口的对象了		while(strTokenAdapter.hasNext()) {			out.println(strTokenAdapter.next());		}

新代码适应老代码:将Iterator转换为Enumeration

反过来的过程就非常easy的了,由于 Enumeration 接口里的方法在 Iterator 中都有定义。
class EnumerationAdapter implements Enumeration {	private Iterator it;		public EnumerationAdapter(Iterator it) {		this.it = it;	}	@Override	public boolean hasMoreElements() {		return it.hasNext();	}	@Override	public Object nextElement() {		return it.next();	}	}
像上面 IteratorAdapter 和 EnumerationAdapter 那样把要被适配的对象保存到类的成员变量里的方式,就叫 Object Adapter。而还有一种 Class Adapter则是要求 Adapter 类同一时候继承适配的两方。比方,有一个名为Apple的类和名为Banana的类,它们的public方法不同样。如今想以调用Apple类方法的方式使用Banana类,那么对于 Class Adapter 来说,就应该让 Adapter 同一时候继承 Apple 和 Banana,然后通过 Adapter 完毕方法调用。有兴趣的话能够用C++实现一下试试。
你可能感兴趣的文章
前端开发面试题准备html+css(上)
查看>>
产品测试的思路
查看>>
Excel中16进制递增、公式后加符号显示的方法
查看>>
TP开发小技巧
查看>>
PyPI使用国内源
查看>>
[转]RoboWare Studio的使用和发布器/订阅器的编写与测试
查看>>
wpf 自定义 无边框 窗体 resize 实现
查看>>
kaggle科比投篮数据集的画图案例
查看>>
5、Angular2 Injectable 服务
查看>>
vi 下鼠标粘帖错乱的
查看>>
JS实现clone()方法,对五种主要数据类型进行值复制
查看>>
解密QQ号——队列
查看>>
python shelve模块
查看>>
vc6.0 动态工具栏按钮
查看>>
APP耗电量专项测试整理
查看>>
ffmpeg编程(二)
查看>>
xcode添加点击事件
查看>>
什么是json
查看>>
dede 日期的所有格式
查看>>
How to set a MySQL root user password in MAC OSX
查看>>