mit einem Klick
iterator
提供一种方法顺序访问容器中的各个元素
Mit Codex oder Claude installieren Kopieren Sie diesen Prompt, fügen Sie ihn in Codex, Claude oder einen anderen Assistant ein und lassen Sie die Skill-Seite prüfen und installieren.
Menü
提供一种方法顺序访问容器中的各个元素
Mit Codex oder Claude installieren Kopieren Sie diesen Prompt, fügen Sie ihn in Codex, Claude oder einen anderen Assistant ein und lassen Sie die Skill-Seite prüfen und installieren.
Basierend auf der SOC-Berufsklassifikation
以聚合根为边界,包含多个相关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的生成器)已经内置了迭代器的强大功能,使该模式更容易使用。