代码
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)来遍历集合对象,而不是直接访问集合中的元素。迭代器模式有助于降低代码的耦合度,并使代码更易于维护和扩展。
- Aggregate(聚合) 已聚合的接口
- ConcreteIterator(具体集合)
- Iterator(迭代器) 执行递增、遍历的接口
- BookShelfIterator(具体的迭代器) 扫描书架的类
- Book 书籍类
- BookShelf 书架类
- Main 测试类
这里面其实只用到了iterator的 hasNext next 两个方法,不会受到具体BookShelf类的影响,
目前是用数组实现管理书籍,假如之后想改用其他集合比如List或者Vector,无论怎么修改,只要能反正
正确的 iterator 就好。下面代码一点也不需要改动。
while (iterator.hasNext()){
Book book = (Book)iterator.next();
System.out.println(book.getName());
}
使用场景:
1、访问一个聚合对象的内容而无须暴露它的内部表示。
2、需要为聚合对象提供多种遍历方式。
3、为遍历不同的聚合结构提供一个统一的接口。
注意事项:
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
总结
设计迭代器模式的目的就是提高类的复用率,就是把类当做一个零部件使用,只要修改某一个零部件,就不需要在费力的去修改其他的零部件。
所以我们在设定程序的时候不把方法 iterator 的返回值 写死 成 BookShelfIterator 类的变量,
而是指定到 Iterator 里面,我们不是要利用BookShelfIterator 去实现程序,而是利用 Iterator 的方法来实现程序。