23种设计模式(一) —— 手写实现 Iterator模式
2023-04-18 14:48:12 时间
文章目录
Author:Gorit
Date:2020/12/1
Refer:《图解设计模式》
2021年发表博文: 1/50
一、Iterator 模式的来源
1.1 Iterator 由来
这是我们常见的循环遍历的方式
int[] arr = new int[199];
for (int i=0;i<arr.length;i++) {
...
}
这里的循环变量 i 的作用抽象化,通用化后形成的模式,在设计模式中称为 Iterator 模式
用于在数据集合中按照顺序遍历集合,iterator 有反复做某件事的意思,因此称为“迭代器”,所以称为 迭代器模式
1.2 实现 Iterator
我们将实现 一个将书 (Book) 放入书架(BookShelf),并将书的名字按顺序显示出来,因此需要用到如下模块
类(接口) | 功能 |
---|---|
Aggregate 接口 | 所要遍历的集合的接口,实现该接口的类将成为一个可以多个元素的集合,就像数组一样 |
Iterator 接口 | 遍历集合的接口 |
Book 类 | 表示书的类 |
BookShelf 类 | 表示书架的类 |
BookShelfIterator | 遍历书架的类 |
Main | 测试 |
Aggregate 接口
package Iterator;
public interface Aggregate {
// 该方法会生成一个用于遍历集合的迭代器,当需要遍历集合的元素时,可以调用该方法
public abstract Iterator iterator();
}
Iterator 接口
package Iterator;
/**
* 用于遍历集合中的元素,相当于循环中的循环变量
* 以下实现了一个最简单的 Iterator 接口
*/
public interface Iterator {
public abstract boolean hasNext(); // 是否有下一个元素
public abstract Object next(); // 下一个元素的值
}
Book 类
package Iterator;
/**
* 书籍的最小实体
*/
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
BookShelf 类
package Iterator;
/**
* 表示书架的类,改类需要作为集合保存 所有的书籍,因此需要实现 Aggregate 接口
*/
public class BookShelf implements Aggregate {
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;
}
// ps 当外部想要遍历书架时,就会调用这个方法:
public Iterator iterator() {
return new BookShelfIterator(this);
}
}
BookShelfIterator 类
package Iterator;
/**
* 用于遍历书架的 BookShelfIterator 类
* 该接口要发挥 Iterator 的作用,因此要实现 Iterator接口
*/
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;
}
return false;
}
public Object next() {
Book book = bookShelf.getBookAt(index++);
return book;
}
}
Main
package Iterator;
public class Main {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(4);
bookShelf.appendBook(new Book("A"));
bookShelf.appendBook(new Book("B"));
bookShelf.appendBook(new Book("C"));
bookShelf.appendBook(new Book("D"));
Iterator it = bookShelf.iterator();
while (it.hasNext()) {
Book book = (Book) it.next();
System.out.println(book.getName());
}
}
}
运行效果
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击