读书人

一个简略的适配器模式例子

发布时间: 2013-02-20 12:23:22 作者: rapoo

一个简单的适配器模式例子

Java的老一辈开发者应该比较熟悉Vector,Stack,Hashtable等集合类。它们的elements()返回一个实现了Enumeration接口的实现类。

但是自从出现Iterator以后,就很少再使用Enumeration了。

Iterator接口声明了三个方法: hasNext(),next(),remove()方法。

而Enumeration只声明了hasMoreElements()和nextElement()方法。分别对应于Iterator的hasNext和next方法。


假设现在客户端的代码只接受接口为Iterator的实现集合。但是现在我们已经拥有了Enumeration集合类。所以这个时候,我们可以使用适配器模式来解决接口不兼容的问题。

/* * 一个简单的适配器模式例子 *  * 具体角色: * Target  - Iterator * Adaptor - EnumerationIterator * Adaptee - Enumeration * client  - print method  */package pattern.adapter;import java.util.Arrays;import java.util.Enumeration;import java.util.Iterator;import java.util.Vector;/** * 把Enumeration接口转换成Iterator接口的适配器  * 适配器模式中的角色 - adaptor */class EnumerationIterator<E> implements Iterator<E> {/** * 被适配的接口 * 适配器模式中的角色 - adaptee  */private Enumeration<E> enums;public EnumerationIterator(Enumeration<E> enums) {this.enums = enums;}@Overridepublic boolean hasNext() {return enums.hasMoreElements();}@Overridepublic E next() {return enums.nextElement();}/** * 因为Enumeration接口不支持remove操作,所以这里简单地抛出异常 */@Overridepublic void remove() {throw new UnsupportedOperationException();}}public class Main {public static void main(String[] args) {Vector<String> students = new Vector<String>(Arrays.asList("Benson","Steven Jobs","Bill Gates","James Gosling","Doug Lea"));Enumeration<String> enums = students.elements();  // 接口为Enumeration,与客户端的Iterator不兼容。Iteratorprint(new EnumerationIterator<String>(enums)); // EnumerationIterator为适配器,将不兼容的Enumeration转换成客户端需要的Iterator接口}/** * 客户端只接受Iterator接口的实现类 * 适配器模式中的角色 - Client */static void print(Iterator<String> iterator) {while(iterator.hasNext()) {System.out.println(iterator.next());}}}


读书人网 >其他相关

热点推荐