3.对组合结构进行迭代:
很容易设计算法来遍历组合结构,访问其中每个成员,并执行某种操作.创建迭代器也许比创建递归算法更加困难.难点在于如何返回对其他程序的控制权、记录某种标签,以便于迭代器能够返回继续执行。组合结构提供一个很好的迭代器范例,开发起来有一定难度。
有人可能会认为在建模时每个问题域的组合结构都需要一个新的迭代器类。实际上,我们可以设计一个可复用的组合迭代器;在需要时,稍微调整组合类就可以获取自己所需的迭代器。
设计要求组合迭代器像组合结构本身一样也是可递归的。为迭代处理某组合结构,应该迭代处理其子类结构--也许这听起来有点复杂。首先需要决定是返回前序节点,还是后续节点。如果选择先序遍历,必须首先遍历子节点,注意每个子节点可能就是一个组合对象。需注意的细节是我们必须维护两个迭代器:第一个迭代器(图1中标识为1)记录哪个节点是当前节点。这个迭代器是个简单的列表迭代器,对子对象列表进行迭代处理。第二个迭代器(图1中的2)把当前子节点当作组合结构进行迭代处理。图1给出决定组合迭代中当前节点的三个方向:
迭代组合结构需要注意的三个地方:0表示头节点,1表示顺序迭代子节点,
2表示把每个子节点当作组合结构进行迭代处理
为确定组合结构迭代器的设计思路,迭代叶节点难度也许不大,但迭代有子节点的节点可能难度较大。我们期望的迭代器设计思路应该类似于图2:
组合枚举器系列的最初设计
这些类使用方法名hasNext()和next(),以便于工作ComponentIterator类实现java.util包中的Iterator接口。
这种设计表明枚举器类构造器将接收一个枚举对象。实际上,这个对象是组合对象,诸如机器组合对象或者流程组合对象。该设计使用一个visited变量来跟踪我们已经列举的节点。这样做可以防止当组合结构有循环时,程序不会陷入无穷循环中。类层次结构顶部的ComponentIterator类的代码如下所示:
package com.oozinoz.iterator;
import java.util.*;
public abstract class ComponentIterator implements Iterator { protected Object head;
protected Set visited;
protected boolean returnInterior = true;
public ComponentIterator(Object head,Set visited){
this.head = head;
this.visited = visited;
}
public void remove(){
throw new UnsupportedOperationException( "componentIterator.Remove");
}
}
这个类把大多数艰难的工作留给子类去完成。
在CompositeIterator子类中,我们需要使用列表迭代器来列举组合节点的子对象。这是图1中标识为1的枚举,在图2中用children变量来表示。组合结构也需要图1中标识为2的枚举器。图2中的subiterator变量可以满足这个需求。CompositeIterator类构造器可以像下面代码那样实例化子枚举器:
public CompositeIterator( Object head,List components,Set visited){
super(head,visited);
children = components.iterator();
}
当开始某组合结构的枚举处理过程时,我们知道第一个返回的节点是头节点(图1中标识为H)。因此,CompositeIterator类的next()方法看起来类似于下面的代码:
public Object next(){
if(peek != null){
Object result = peek;
peek = null;
return result;
}
if(!visited.contains(head)){
visited.add(head); return head;
}
return nextDescendant();
}
next()方法使用visited集合来记录该枚举器是否已经返回头节点。如果该枚举器已经返回组合结构的头节点,nextDescendant()方法必须查找下一个节点。
在任何时间,subiterator变量都可以枚举自身是组合节点的子节点。如果枚举器是有效的,CompositeIterator类的next()方法可以“移动”这个子迭代器。如果子迭代器不能移动,代码必须移动到children列表的下一个元素,为其分配一个子枚举器,并移动这个枚举器。nextDescendant()方法的代码如下所示:
public Object nextDescendant(){ while(true){ if(subiterator != null){ return subiterator.next(); } if(!children.hasNext()) return null; ProcessComponent pc = (ProcessComponent) children.next(); if(!visited.contains(pc)){ subiterator = pc.iterator(visisted); } } }
根据枚举的对象类型不同,该方法本身存在一定限制:代码要求组合结构的子对象实现iterator(s:Set)方法。考虑组合结构的一个例子,比如第5章介绍的ProcessComponent类层次结构。图3给出Oozinoz应用程序用于模拟制造各种焰火制品的工作流的过程组合对象类层次。
Oozinoz公司制造过程流是组合结构
- 大小: 11.4 KB
- 大小: 9 KB
- 大小: 9 KB
- 大小: 3 KB
分享到:
相关推荐
C#面向对象设计模式 (行为型模式) Iterator 迭代器模式 视频讲座下载
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不... 这是第18节:行为型模式Iterator迭代器模式
首先,迭代器模式包含两个主要角色:聚合对象(Aggregate)和迭代器(Iterator)。聚合对象持有元素的集合,并提供创建迭代器的方法。迭代器则负责遍历聚合对象中的元素,它有一个或多个方法用于移动到下一个元素,...
### Iterator迭代器详解 #### 一、Iterator简介与概念 在Java编程语言中,`Iterator`接口是一个重要的组件,它提供了遍历集合的基本方法。`Iterator`的主要作用是在不暴露集合内部结构的情况下,顺序访问集合中的...
例如,在Java中,`Iterable`接口和`Iterator`接口就是实现迭代器模式的关键。`Iterable`接口定义了获取迭代器的方法`iterator()`,而`Iterator`接口提供了`hasNext()`和`next()`方法,分别用于检查是否还有下一个...
迭代器模式是软件设计模式中的一种行为模式,它在C#等面向对象编程语言中有着广泛的应用。这个模式的主要目标是允许用户遍历一个聚合对象(如数组、集合或列表)的所有元素,而无需了解底层的实现细节。下面将详细...
在Java编程语言中,迭代器模式(Iterator Pattern)是一种常用的设计模式,用于顺序访问集合对象中的元素,而无需暴露其底层表示。这种模式提供了一种方法来访问一个聚合对象的元素,而无需暴露该对象的内部结构。在...
迭代器模式是一种设计模式,属于行为设计模式,它允许我们顺序访问聚合对象的元素,而无需暴露其底层表示。在Java、C#等面向对象语言中,迭代器模式被广泛应用于容器类,如ArrayList、LinkedList等,使得我们可以...
迭代器模式(IteratorPattern)是设计模式中的一种行为模式,它提供了一种顺序访问聚合对象元素的方法,同时又不暴露其底层表示。这种模式允许我们遍历集合对象的元素,而无需暴露其内部结构。在Java、C#等面向对象...
迭代器模式(Iterator Pattern)是Java设计模式中的行为模式之一,它提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。在Java中,迭代器模式被广泛应用于集合类,如ArrayList、LinkedList等,通过...
迭代器模式是软件开发中广泛使用的设计模式之一,特别是在处理聚合数据结构如数组、列表和集合时。迭代器模式可以提供一种统一的方式来遍历这些结构中的元素,从而使得开发者不需要关心聚合对象的内部实现细节。通过...
迭代器模式是一种设计模式,它在软件工程中扮演着重要的角色,特别是在处理集合或容器类对象的遍历操作时。这种模式提供了一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。在Java、C#等面向对象语言中,...
迭代器模式是软件设计模式中的一种行为模式,它允许我们顺序访问聚合对象的元素,而无需暴露其底层表示。在Java、C#等面向对象语言中,迭代器模式被广泛应用于容器类,如ArrayList、LinkedList等,使得我们可以方便...
迭代器模式是一种行为设计模式,它提供了一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。在Java中,迭代器模式是通过接口实现的,这使得我们可以遍历任何实现了`Iterable`接口的对象,例如集合框架中的`...
在Java、C#等面向对象语言中,迭代器模式的应用非常广泛,例如Java中的`Iterable`接口和`Iterator`接口,C#中的`IEnumerable`接口和`IEnumerator`接口。这些接口为实现迭代器模式提供了标准的方式。 迭代器模式的...
迭代器模式(Iterator Pattern)是设计模式中的一种行为模式,它允许顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式提供了一种方法,可以顺序地访问一个聚合对象中的各个元素,而又...
迭代器模式是软件设计模式中的行为模式之一,它在C++编程中有着广泛的应用。这个模式提供了一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。通过迭代器,用户可以遍历集合中的所有元素,而无需知道如何...
在这个主题中,我们主要探讨了如何利用组合模式(Composite Pattern)构建二叉树,并通过迭代器模式(Iterator Pattern)来实现对树的遍历,包括前序、中序和后序遍历。这些是设计模式中的经典应用,对于理解和掌握...