簡単なアダプターパターンの例
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の集合類を持っています。そのため、アダプターモードを使って、インターフェースの互換性がない問題を解決できます。
しかし、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());
}
}
}