com um clique
iterator
提供一种方法顺序访问容器中的各个元素
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Menu
提供一种方法顺序访问容器中的各个元素
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Baseado na classificação ocupacional SOC
以聚合根为边界,包含多个相关Entity和ValueObject的集合。保证数据一致性和事务边界。
在DDD中具有唯一身份标识和生命周期的对象,通过身份而非属性值相等判断。
封装复杂对象和聚合的创建过程,将创建职责从领域对象中剥离,保证聚合创建时的不变量满足。
没有身份标识,通过属性值判断相等的对象。不可变,通常代表领域中的度量或描述。
命令查询责任分离,将数据的写入操作和读取操作分别用不同的模型处理,优化各自的性能。
将DDD战略设计应用于微服务架构,限界上下文指导服务拆分,领域事件实现服务间通信。
| name | Iterator |
| description | 提供一种方法顺序访问容器中的各个元素 |
| license | MIT |
Iterator是一种Behavioral设计模式。
定义: 提供一种方法来顺序访问一个聚合对象中的各个元素,而不暴露该对象的内部表示。它将集合的遍历与其内部结构分离。
┌──────────────────┐
│ Iterator │
├──────────────────┤
│ + next() │
│ + hasNext() │
│ + remove() │
└──────────────────┘
△
│ implements
┌────┴─────────────────┐
│ │
┌──────────────────┐ ┌────────────────────┐
│ListIterator │ │TreeIterator │
├──────────────────┤ ├────────────────────┤
│ - current │ │ - stack │
│ + next() │ │ + next() │
└──────────────────┘ └────────────────────┘
▲ ▲
│ │
┌────┴──────────────────────┴───────┐
│ │
┌──────────────────┐ ┌──────────────────┐
│ Aggregate │ │ ConcreteAggregate│
├──────────────────┤ ├──────────────────┤
│+ createIterator()│─────────→│ - elements: List │
└──────────────────┘ │+ createIterator()│
└──────────────────┘
特点: 集合外部管理遍历状态
interface Iterator<T> {
boolean hasNext();
T next();
void remove();
}
class ListIterator<T> implements Iterator<T> {
private List<T> list;
private int currentIndex = 0;
ListIterator(List<T> list) {
this.list = list;
}
@Override
public boolean hasNext() {
return currentIndex < list.size();
}
@Override
public T next() {
if (!hasNext()) throw new NoSuchElementException();
return list.get(currentIndex++);
}
@Override
public void remove() {
list.remove(--currentIndex);
}
}
// 使用示例
List<String> names = Arrays.asList("Alice", "Bob", "Carol");
Iterator<String> iterator = new ListIterator<>(names);
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
特点: 集合内部管理遍历,通过回调处理元素
interface Collection<T> {
void forEach(Consumer<T> action);
}
class MyCollection<T> implements Collection<T> {
private T[] elements;
@Override
public void forEach(Consumer<T> action) {
for (T element : elements) {
action.accept(element);
}
}
}
// 使用示例 - Lambda表达式
MyCollection<String> collection = new MyCollection<>();
collection.forEach(System.out::println);
特点: 使用生成器或协程处理无限序列
// Java生成器模式
abstract class Generator<T> {
abstract void execute();
protected void yield(T value) {
// 储存value,暂停执行
}
}
// Python生成器
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
gen = fibonacci()
for i in range(10):
print(next(gen))
特点: 支持异步操作,如异步I/O
async function* asyncGenerator() {
for (let i = 0; i < 5; i++) {
await delay(1000);
yield i;
}
}
// 使用
for await (const value of asyncGenerator()) {
console.log(value);
}
应用: JDBC ResultSet, ORM框架
// 数据库查询结果遍历
try (Statement stmt = connection.createStatement()) {
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
while (rs.next()) {
System.out.println(rs.getString("name"));
}
}
// 或使用迭代器
class DatabaseIterator implements Iterator<Record> {
private ResultSet resultSet;
@Override
public boolean hasNext() {
try {
return resultSet.next();
} catch (SQLException e) {
return false;
}
}
@Override
public Record next() {
try {
return mapRecord(resultSet);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
应用: XML/HTML解析, DOM操作
// XML节点遍历
interface NodeIterator {
Node nextNode();
}
class DepthFirstIterator implements NodeIterator {
private Stack<Node> stack;
public DepthFirstIterator(Node root) {
stack = new Stack<>();
stack.push(root);
}
@Override
public Node nextNode() {
if (stack.isEmpty()) return null;
Node node = stack.pop();
// 按相反顺序压入子节点
for (int i = node.getChildCount() - 1; i >= 0; i--) {
stack.push(node.getChild(i));
}
return node;
}
}
应用: Java Collections Framework
// Java内置迭代器
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
// 外部迭代器
Iterator<String> iter1 = list.iterator();
while (iter1.hasNext()) {
System.out.println(iter1.next());
}
// 内部迭代器 (Stream API)
list.forEach(System.out::println);
// 增强for循环 (Iterator的语法糖)
for (String item : list) {
System.out.println(item);
}
应用: 文件系统遍历, 递归查找
// 遍历目录结构
class DirectoryIterator {
private Queue<File> queue = new LinkedList<>();
public DirectoryIterator(File root) {
queue.offer(root);
}
public File next() {
if (queue.isEmpty()) return null;
File file = queue.poll();
if (file.isDirectory()) {
for (File child : file.listFiles()) {
queue.offer(child);
}
}
return file;
}
}
// Java NIO
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
for (Path file : stream) {
System.out.println(file);
}
}
应用: Web框架分页, API游标
// 分页式加载
class PageIterator<T> implements Iterator<T> {
private int pageSize;
private int currentPage = 0;
private List<T> currentPageData;
private DataRepository repo;
@Override
public boolean hasNext() {
if (currentPageData == null) {
loadNextPage();
}
return !currentPageData.isEmpty();
}
@Override
public T next() {
if (currentPageData == null || currentPageData.isEmpty()) {
loadNextPage();
}
return currentPageData.remove(0);
}
private void loadNextPage() {
currentPageData = repo.findPage(currentPage++, pageSize);
}
}
应用: 函数式编程, 数据流处理
// Stream API - 内置迭代
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
.filter(n -> n > 2)
.map(n -> n * 2)
.forEach(System.out::println);
// 自定义流迭代
class StreamIterator<T> implements Iterator<T> {
private List<T> data;
private Function<T, Boolean> filter;
private Function<T, T> transform;
private int index = 0;
@Override
public boolean hasNext() {
// 跳过不符合filter的元素
while (index < data.size()) {
if (filter.apply(data.get(index))) {
return true;
}
index++;
}
return false;
}
@Override
public T next() {
return transform.apply(data.get(index++));
}
}
症状:
解决方案:
// ✅ 使用迭代器的remove()方法
List<String> list = new ArrayList<>();
list.add("A"); list.add("B"); list.add("C");
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
String item = iter.next();
if (item.equals("B")) {
iter.remove(); // ✅ 安全
}
}
// ❌ 直接修改集合会失败
for (String item : list) {
if (item.equals("B")) {
list.remove(item); // ❌ ConcurrentModificationException
}
}
// ✅ 或使用线程安全的集合
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
// ✅ 或使用Copy-On-Write集合
List<String> cowList = new CopyOnWriteArrayList<>(list);
for (String item : cowList) {
if (item.equals("B")) {
cowList.remove(item);
}
}
症状:
解决方案:
// ✅ 延迟加载迭代器
abstract class LazyIterator<T> implements Iterator<T> {
protected abstract T loadNext();
@Override
public T next() {
return loadNext();
}
}
// 无限序列 - Fibonacci
class FibonacciIterator implements Iterator<Long> {
private long prev = 0, curr = 1;
@Override
public boolean hasNext() {
return true; // 无限
}
@Override
public Long next() {
long next = prev + curr;
prev = curr;
curr = next;
return prev;
}
}
// 使用
FibonacciIterator fib = new FibonacciIterator();
for (int i = 0; i < 10; i++) {
System.out.println(fib.next());
}
症状:
解决方案:
// ✅ 为每种遍历模式定义专门的迭代器
interface TreeIterator<T> extends Iterator<T> {}
class PreOrderIterator<T> implements TreeIterator<T> {
private Stack<TreeNode<T>> stack;
public PreOrderIterator(TreeNode<T> root) {
stack = new Stack<>();
stack.push(root);
}
@Override
public boolean hasNext() {
return !stack.isEmpty();
}
@Override
public T next() {
TreeNode<T> node = stack.pop();
// 先压入右子树,再压入左子树(使左子树先出)
if (node.right != null) stack.push(node.right);
if (node.left != null) stack.push(node.left);
return node.value;
}
}
class InOrderIterator<T> implements TreeIterator<T> {
private Stack<TreeNode<T>> stack = new Stack<>();
private TreeNode<T> current;
public InOrderIterator(TreeNode<T> root) {
current = root;
}
@Override
public boolean hasNext() {
return current != null || !stack.isEmpty();
}
@Override
public T next() {
while (current != null) {
stack.push(current);
current = current.left;
}
current = stack.pop();
T result = current.value;
current = current.right;
return result;
}
}
症状:
解决方案:
// ✅ 快照方式 - 迭代列表当时的副本
class SnapshotIterator<T> implements Iterator<T> {
private List<T> snapshot;
private int index = 0;
public SnapshotIterator(List<T> original) {
this.snapshot = new ArrayList<>(original); // 深拷贝
}
@Override
public boolean hasNext() {
return index < snapshot.size();
}
@Override
public T next() {
return snapshot.get(index++);
}
}
// ✅ 动态视图方式 - 始终反映集合当前状态
class DynamicViewIterator<T> implements Iterator<T> {
private List<T> original;
private int index = 0;
public DynamicViewIterator(List<T> original) {
this.original = original;
}
@Override
public boolean hasNext() {
return index < original.size();
}
@Override
public T next() {
if (index >= original.size()) {
throw new NoSuchElementException();
}
return original.get(index++);
}
}
// 选择合适的方式
List<String> list = new ArrayList<>();
// 快照 - 线程安全,但可能过时
Iterator<String> snapshot = new SnapshotIterator<>(list);
// 动态 - 实时但不安全
Iterator<String> dynamic = new DynamicViewIterator<>(list);
| 模式 | 关系 | 何时结合 |
|---|---|---|
| Composite | 遍历树形结构 | 树的递归遍历 |
| Factory | 创建正确的迭代器 | 根据集合类型选择迭代器 |
| Strategy | 不同的遍历算法 | 支持多种遍历方式 |
| Visitor | 访问集合中的元素 | 结合迭代器遍历和元素操作 |
| Observer | 订阅集合变化 | 遍历时响应集合变化 |
// ✅ 实现标准接口
public class MyIterator implements Iterator<T> {
@Override
public boolean hasNext() { }
@Override
public T next() { }
@Override
public void remove() { }
}
// ✅ 为不同场景提供不同迭代器
class TreeNode<T> {
Iterator<T> preOrder() { }
Iterator<T> inOrder() { }
Iterator<T> postOrder() { }
Iterator<T> levelOrder() { }
}
// ✅ 检测并发修改
class SafeIterator<T> implements Iterator<T> {
private int modCount;
private int expectedModCount;
@Override
public T next() {
checkConcurrentModification();
return ...;
}
private void checkConcurrentModification() {
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
}
迭代器模式通过提供统一的遍历接口,将集合的结构与遍历算法分离,提供了灵活的遍历机制。现代语言(如Java的Stream API、Python的生成器)已经内置了迭代器的强大功能,使该模式更容易使用。