代码
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;}@Overridepublic 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;}@Overridepublic boolean hasNext() {if (index < bookShelf.getLength()) {return true;} else {return false;}}@Overridepublic 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 的方法来实现程序。