生成器是实现迭代器模式的高效手段,通过封装遍历逻辑使客户端仅通过标准协议消费数据,节点类去遍历化、只暴露只读接口,遍历策略由生成器函数决定,状态隔离、按需展开、输出标准化视图并支持环检测与策略插拔。

生成器模式本身不是设计模式,而是实现迭代器模式的高效手段。真正“动态暴露精密控制的迭代器方法”的核心,是用生成器函数封装遍历逻辑,让客户端只通过标准协议(如 next() 或 for...of)消费数据,却完全无法触碰底层树结构——这才是保护受控数据树的关键。
用生成器封装遍历逻辑,节点类彻底去遍历化
树节点只保留数据和基础访问能力,不提供任何 traverse()、forEach() 等方法:
- 每个节点仅暴露
getName()、getChildren()、isLeaf()这类只读接口 - 遍历顺序(前序/中序/层序)、方向(正向/逆向)、过滤条件(如只取叶子、跳过禁用项)全部由生成器函数决定
- 修改遍历策略只需新增一个生成器函数,不影响已有节点定义或业务代码
生成器内部做状态隔离与按需展开
每次调用 createIterator() 都返回一个全新生成器实例,彼此状态互不干扰:
- 用栈模拟 DFS 时,每个迭代器独占自己的栈空间;用队列实现 BFS 时,各自维护独立队列
- 每调用一次
next(),生成器只计算并产出下一个节点,不预构建整棵树的扁平数组 - 支持中途
break或return,避免对深层子树做无谓展开(尤其适合大配置树或权限树)
统一输出形态,切断原始引用泄露
生成器不直接 yield node,而是返回标准化的只读视图对象:
- 例如:
{ path: 'users.admin.roles', value: ['read', 'write'], depth: 3, isEditable: false } - 字段经脱敏处理(隐藏敏感元数据)、深度冻结(
Object.freeze)或浅拷贝(防篡改) - 客户端拿到的是“快照”,无法通过该对象反向修改原始树节点或触发副作用
图结构兼容:内置环检测与策略可插拔
若树实际是带回边的图(如组织架构含汇报循环),生成器需主动防御重复访问:
- 内部维护
visited = new Set(),每次 yield 前检查节点 ID 是否已存在 - 支持传入遍历策略参数:
createIterator({ strategy: 'bfs', maxDepth: 4 }) - 不同策略对应不同生成器实现,但对外仍遵循同一
[Symbol.iterator]协议,客户端无需感知差异











