有朋友问我MeteorTL(
http://www.meteortl.org)优势列表中的主控Iterator模式优势具体指什么。
buaawhl的帖子已经分析很多:
http://www.iteye.com/topic/21293
我再补充的说一下:
Visitor模式使用最多的时候是处理合成模式的树结构,
估计是受[GoF95]的影响,书中提倡将树结构的表示与逻辑分开,
这样不同的Visitor对同一树结构可以做不同的事,以达到重用及扩展,
如:将一个模板解析成树后,针对同一树结构表示,EvaluationVisitor可以输出模板结果,
BackupVisitor可以备份树,CountVisitor可以统计树中的节点...
这种思想很好,但实际中,如果以Visitor风格导出API,API很难理解,也很难使用,
因为扩展方很被动,并不是每一次使用树都是要做遍历操作的,
而且,Visitor通常会很大,因为它要处理所有节点类型,通常是用很多类型重载的visit方法,
再者,往往最后都是,整个系统只有一个Visitor,因为Visitor的实现很复杂,
其实Visitor模式的优势Iterator模式都能作到,
如果改用Iterator模式,可以使用解释器模式的层级调用,
在主控函数中回调Handler,以及发布访问前后Event,再加上个AOP拦截器链,
扩展者可以只Handle某一个节点类型的处理,也可通过监听事件处理周边事物,或者通过AOP统一处理所有节点,
灵活性远远超过Visitor模式,
如:FreeMarker, Velocity都使用了Visitor模式,扩展性是极其受限的,这可能是由于它们都使用JavaCC作为解板工具,而JavaCC生成Visitor模式的解析代码,有点被迫使用。
而MeteorTL(
http://www.meteortl.org)则使用Iterator模式,在扩展性方面就很有优势。
节点的扩展是经常用到的,举个例对比一下:
Visitor模式的:
public class NodeHandler {
public static final int DO_BODY = 1;
...
// 因为Node是被动的,所以返回一个数字控制Visitor的遍历路线,
// 除非只作正规的前序遍历,就能满足你所有的需求,则可以不返回值,
public int handle() {
// 返回1,继续访问内部节点
// 返回2,继续访问下一兄弟节点
// 返回3,表示重复当前节点
// 返回4,表示跳过后面所有节点
// ...
}
}
看到上面的方式,估计写过JSP Tag Lib的朋友印象深刻,doStrat, doEnd就是这么做的。
调用者(JSP引擎相当于调用者)也很费神,要一个个判断状态位,if...else...估计是一大堆。
如果你的需求超过了上面的1, 2, 3, 4...,那就没办法,等新版本发布可能会有:-)
Iterator模式的:
public class NodeHandler {
// 每个节点持有自己的子节点,解析树时置入
Node[] childNodes;
public void handle() {
// 1.如果要忽略子节点,直接将函数留空
// 2.如果要运行字节点
handleChildNodes();
// 3.如果要迭代子节点n次
for (int i = 0, i < n; i ++) {
handleChildNodes();
}
}
private void handleChildNodes() {
for(int i = 0, n = childNodes.length; i < n; i ++) {
childNodes[i].handle();
}
}
}
调用者只需要调用根节点的handle(),根节点将调用其所有子节点,层级调用下去就完成了遍历,需不需要调用下级节点完全是主控的。
分享到:
相关推荐
### Java源码分析:深入探讨Iterator模式 #### 一、引言 在Java编程语言中,集合框架(`java.util`包)提供了多种容器类来存储对象,如`List`、`Set`和`Map`等。为了遍历这些容器中的元素,Java引入了迭代器模式...
所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式。本文以java中的容器为例,模拟Iterator的原理。 参考:马士兵 Java设计模式 Iterator 1.首先定义一个容器Collection接口. 2.定义一个Iterator...
在给定的文档中,作者提到在处理JSOM、XML、Java bean等对象时,虽然访问者模式很常见,但在某些情况下,访问者模式可能不便于控制回调逻辑,这时可以使用Iterator模式来解决。 具体到文档内容,`StringGenerator`...
【Iterator模式】是一种设计模式,它提供了一种顺序访问聚合对象元素的方式,而又不暴露其底层表示。在Java中,Iterator接口是实现此模式的主要工具,它允许我们遍历任何集合,如ArrayList、LinkedList等,而无需...
迭代器模式是软件设计模式中的一种行为模式,它在C++中的应用十分广泛。这个模式的主要目的是提供一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。通过使用迭代器模式,用户可以遍历任何聚合对象,而无需...
C#面向对象设计模式 (行为型模式) Iterator 迭代器模式 视频讲座下载
Iterator模式是一种设计模式,它提供了一种顺序访问聚合对象的元素而不暴露其底层表示的方法。在Java中,Iterator模式常用于遍历集合(如ArrayList、LinkedList等)和Map,使得开发者可以方便地对集合进行操作,而...
Iterator模式是一种设计模式,它允许程序访问集合对象的元素而不暴露其底层表示。在这个场景中,我们关注的是如何使用Iterator模式将对象转换为可读性强的字符串,这在日志记录、调试或输出对象信息时非常有用。我们...
Iterator模式是一种行为设计模式,它的主要作用是在不暴露容器内部结构的情况下,允许外部代码逐个访问容器中的元素。在Java中,Iterator模式被广泛应用于集合框架,如ArrayList、LinkedList等,使得用户能够方便地...
迭代器模式是软件设计模式中的一种行为模式,它在C#等面向对象编程语言中有着广泛的应用。这个模式的主要目标是允许用户遍历一个聚合对象(如数组、集合或列表)的所有元素,而无需了解底层的实现细节。下面将详细...
大体思想:分页的核心思想采用 Iterator模式,每次从数据库中取定量的数据块 其中block和pageCount是两个不同的概念,block是块,规定了从数据库中获取的数量 pageCount为表现层每页显示的数量 另外参数中还包含缓存...
在Java编程语言中,Iterator模式是一种设计模式,用于在各种数据结构(如集合)中进行迭代操作,使得用户可以顺序地访问集合中的元素,而无需了解底层数据结构的细节。这个模式有效地解耦了集合对象和遍历行为,提供...
总的来说,迭代器模式是一种强大的工具,它提高了代码的可读性和可维护性,通过将遍历逻辑从聚合类中分离出来,实现了数据结构与遍历方式的解耦。在开发过程中,合理运用迭代器模式可以使得代码更加灵活且易于扩展。
访客模式 作者:Brian ( ) 您必须一组两个一组地工作 迭代器类 您已经获得了四个文件,其中包含以下五个迭代器类的声明和定义: 迭代器:这是用于定义所有其他迭代器类的接口的基类 NullIterator:此迭代器由...
迭代器模式(IteratorPattern)是设计模式中的一种行为模式,它提供了一种顺序访问聚合对象元素的方法,同时又不暴露其底层表示。这种模式允许我们遍历集合对象的元素,而无需暴露其内部结构。在Java、C#等面向对象...
### C++中的Iterator模式详解 #### 什么是Iterator模式? 在软件工程中,设计模式是一种用于解决特定问题的通用可重用解决方案。Iterator模式是其中的一种,其主要目标是在不暴露集合内部结构的情况下,为遍历集合...
F_Java源码分析:深入探讨Iterator模式
其他文件如`.classpath`、`.project`、`build.xml`、`Workspace.sws`等是Eclipse项目配置文件,它们与迭代模式的理论知识关系不大,主要用于项目的构建和管理。 ### 总结 迭代模式是设计模式中的重要成员,它简化了...
singleton模式、Factory模式、Abstract Factory模式、Builder模式、Prototype模式、Adapter模式、Bridge模式、Composite模式、Decorator模式、...、Interpreter模式、Iterator模式、Mediator模式、Memento模式等...