簡単なアダプターパターンの例

1997 ワード

Javaの古い世代の開発者は、Vector、Stock、Hashtableなどの集合類に詳しいはずです。それらのelements()は、Enumerationインターフェースを実装した実装クラスを返します。
しかし、Iteratorが現れてから、Eumerationはあまり使われなくなりました。
Iteratorインターフェースは3つの方法を声明しました。has Next()、next()、remove()方法。
Enumerationはhas Moreelements()とnextElement()の方法だけを宣言しました。Iteratorのhas Nextとnextの方法にそれぞれ対応します。
現在のクライアントのコードはインターフェースがIteratorの実現セットであると仮定します。でも、今はもうEumerationの集合類を持っています。そのため、アダプターモードを使って、インターフェースの互換性がない問題を解決できます。
/*
 *             
 * 
 *     :
 * 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;
	}
	
	@Override
	public boolean hasNext() {
		return enums.hasMoreElements();
	}

	@Override
	public E next() {
		return enums.nextElement();
	}

	/**
	 *   Enumeration     remove  ,           
	 */
	@Override
	public 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   。
Iterator
		print(new EnumerationIterator<String>(enums)); // EnumerationIterator    ,     Enumeration         Iterator  
	}
	
	/**
	 *       Iterator      
	 *           - Client
	 */
	static void print(Iterator<String> iterator) {
		while(iterator.hasNext()) {
			System.out.println(iterator.next());
		}
	}
}