大きい話の設計のモードの20:ディエ代機のモード(歩きたいですか?はい、先にチケットを買います
ディケンサモード:JavaのIterator類と同様に、統合されたオブジェクトのそれぞれの要素に順次アクセスする方法を提供する。
//
public class Book {
private String name = "";
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
// , ,
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
//
public class BookShelfIterator implements Iterator {
private BookShelf bookShelf; //
private int index; //
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}
public boolean hasNext() { //
if (index < bookShelf.getLength()) {
return true;
} else {
return false;
}
}
public Object next() { //
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}
//
public interface Aggregate {
public abstract Iterator iterator();
}
//
public class BookShelf implements Aggregate {
private Book[] books;
private int index = 0; //
public BookShelf(int maxSize) {
this.books = new Book[maxSize];
}
public Book getBookAt(int index) {
return books[index];
}
public void appendBook(Book book) { //
this.books[index] = book;
index++;
}
public int getLength() { //
return books.length;
}
public Iterator iterator() { //
return new BookShelfIterator(this);
}
}
public class Main {
public static void main(String[] args) {
//
BookShelf bookShelf = new BookShelf(4);
//
bookShelf.appendBook(new Book(" "));
bookShelf.appendBook(new Book("C++ "));
bookShelf.appendBook(new Book("J2EE "));
bookShelf.appendBook(new Book("Java "));
//
Iterator it = bookShelf.iterator();
while (it.hasNext()) {
Book book = (Book) it.next();
System.out.println(book.getName());
}
}
}
全体としては、集合体のエルゴード行為を分離し、集合体の内部構造を暴露しなくてもいいし、集合内部のデータに外部コードを透明にアクセスさせることもできる。ディレクタモードは訪問配列、集合、データベースを操作する時に使うのが非常に一般的です。普遍的なため、各種の高級言語がカプセル化されています。このモード自体はあまり一般的ではないと感じられます。