コード
package com.fly.patterns.iterator;
/**
* @author fei.chen
* @projectName design-patterns
* @description: 只声明一个方法,为了建立一个可对应聚合的Iterator
* @date 2023/5/29下午 4:08
*/
public interface Aggregate {
/**
* 在进行递增、遍历或者检查某个聚合时,利用 iterator 方法即可建立一个实现 Iterator 接口的类对象实例
* @return
*/
abstract Iterator iterator();
}
package com.fly.patterns.iterator;
/**
* @author fei.chen
* @projectName design-patterns
* @description: 执行元素递增
* @date 2023/5/29下午 4:09
*/
public interface Iterator {
/**
* 检查是否有下一元素
* boolean 是结束与继续的条件
* @return
*/
abstract boolean hasNext();
/**
* 取得 下一元素
* @return
*/
abstract Object next();
}
package com.fly.patterns.iterator;
/**
* @author fei.chen
* @projectName design-patterns
* @description: 书籍类
* @date 2023/5/29下午 4:09
*/
public class Book {
private String name = "";
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
package com.fly.patterns.iterator;
import java.util.Vector;
/**
* @author fei.chen
* @projectName design-patterns
* @description: 书架作用类; 要实现 Aggregate 接口 才能把本类当做聚合来处理。
* @date 2023/5/29下午 4:39
*/
public class BookShelf implements Aggregate {
// // book 数组;大小要在开始时就设定; 注意:这是私有参数 不能被其他类修改。
// private Book[] books;
// private int last = 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[last] = book;
// last++;
// }
//
// public int getLength(){
// return last;
// }
//
// @Override
// public Iterator iterator() {
// return new BookShelfIterator(this);
// }
// book 数组;大小要在开始时就设定; 注意:这是私有参数 不能被其他类修改。
private Vector<Book> books;
private int last = 0;
public BookShelf(int maxsize){
this.books = new Vector<>(maxsize);
}
public Book getBookAt(int index){
return books.get(index);
}
public void appendBook(Book book){
books.add(last,book);
last++;
}
public int getLength(){
return last;
}
@Override
public Iterator iterator() {
return new BookShelfIterator(this);
}
}
package com.fly.patterns.iterator;
/**
* @author fei.chen
* @projectName design-patterns
* @description: 扫描 BookShelf类的类
* @date 2023/5/29下午 4:44
*/
public class BookShelfIterator implements Iterator {
/** 要扫描的书架 */
private BookShelf bookShelf;
/** 书架的下标 */
private int index;
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}
@Override
public boolean hasNext() {
if (index < bookShelf.getLength()) {
return true;
} else {
return false;
}
}
@Override
public Object next() {
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}
package com.fly.patterns.iterator;
/**
* @author fei.chen
* @projectName design-patterns
* @description: 测试类
* @date 2023/5/29下午 4:49
*/
public class Main {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(4);
bookShelf.appendBook(new Book("第1本书 《我的世界》"));
bookShelf.appendBook(new Book("第2本书 《世界简史》"));
bookShelf.appendBook(new Book("第3本书 《人类监视》"));
bookShelf.appendBook(new Book("第4本书 《动物世界》"));
Iterator iterator = bookShelf.iterator();
while (iterator.hasNext()){
Book book = (Book)iterator.next();
System.out.println(book.getName());
}
}
}
イテレータパターン
このパターンは、コレクション オブジェクトの基礎となる表現を知らなくても、コレクション オブジェクトの要素に順次アクセスするために使用されます。イテレータ パターンは動作パターンです。これにより、より柔軟で拡張可能な方法でコレクション オブジェクトを反復処理できるようになります。このモードは、コレクション内の要素に直接アクセスするのではなく、反復子 (Iterator) を提供することによってコレクション オブジェクトを走査します。イテレータ パターンはコードを分離するのに役立ち、保守と拡張が容易になります。
- アグリゲート 集約されたインターフェイス
- ConcreteIterator (具体的なコレクション)
- インクリメントとトラバーサルを実行するためのイテレータ (反復子) インターフェイス
- 本棚をスキャンするための BookShelfIterator (特定の反復子) クラス
- 本
- BookShelf 本棚クラス
- メインテストクラス
実際には、イテレータの hasNext next の 2 つのメソッドのみがここで使用されており、特定の BookShelf クラスの影響を受けません。現在、
書籍の管理には配列が使用されています。将来的に List や Vector などの他のコレクションを使用したい場合は、どのように変更しても、できる限り
正しいイテレータで問題ありません。次のコードはまったく変更する必要はありません。
while (iterator.hasNext()){
Book book = (Book)iterator.next();
System.out.println(book.getName());
}
使用するシーン:
1. 内部表現を公開せずに集約オブジェクトのコンテンツにアクセスします。
2. 集約されたオブジェクトに対して複数のトラバースメソッドを提供する必要があります。
3. さまざまな集約構造を横断するための統一インターフェイスを提供します。
予防:
イテレータ モードは、コレクション オブジェクトのトラバース動作を分離し、担当するイテレータ クラスを抽象化するため、コレクションの内部構造が公開されることはなく、外部コードはコレクション内のデータに透過的にアクセスできます。
要約する
イテレータパターンを設計する目的は、クラスをコンポーネントとして利用するというクラスの再利用率を高めることであり、あるコンポーネントを変更すれば他のコンポーネントを苦労して変更する必要がありません。
そこでプログラムを設定する際には、メソッドイテレータの戻り値をBookShelfIteratorクラスの変数に書き込むのではなく、
Iterator内で指定するようにしています。プログラムを実装するためのイテレータ。