`
javatar
  • 浏览: 1699777 次
  • 性别: Icon_minigender_1
  • 来自: 杭州699号
社区版块
存档分类
最新评论

主控Iterator模式与被动Visitor模式

    博客分类:
  • HTTL
阅读更多
有朋友问我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(),根节点将调用其所有子节点,层级调用下去就完成了遍历,需不需要调用下级节点完全是主控的。

分享到:
评论
2 楼 wwlhp 2008-01-12  
对楼主的项目不熟悉。
Visitor模式确实很不好,Visitor接口要依赖于被访问的各个具体子类,请楼主讲解一下Iterator模式如何替代Visitor模式并允许被访问接口新增子类的,谢谢!
1 楼 nogocn 2007-09-11  
javatar,你的技术太强了

相关推荐

    Java源码分析:深入探讨Iterator模式

    ### Java源码分析:深入探讨Iterator模式 #### 一、引言 在Java编程语言中,集合框架(`java.util`包)提供了多种容器类来存储对象,如`List`、`Set`和`Map`等。为了遍历这些容器中的元素,Java引入了迭代器模式...

    Java设计模式之Iterator模式

    所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式。本文以java中的容器为例,模拟Iterator的原理。 参考:马士兵 Java设计模式 Iterator 1.首先定义一个容器Collection接口. 2.定义一个Iterator...

    使用Iterator模式将对象转成String (2).docx

    在给定的文档中,作者提到在处理JSOM、XML、Java bean等对象时,虽然访问者模式很常见,但在某些情况下,访问者模式可能不便于控制回调逻辑,这时可以使用Iterator模式来解决。 具体到文档内容,`StringGenerator`...

    使用Iterator模式将对象转成String.docx

    【Iterator模式】是一种设计模式,它提供了一种顺序访问聚合对象元素的方式,而又不暴露其底层表示。在Java中,Iterator接口是实现此模式的主要工具,它允许我们遍历任何集合,如ArrayList、LinkedList等,而无需...

    C++ Iterator模式

    迭代器模式是软件设计模式中的一种行为模式,它在C++中的应用十分广泛。这个模式的主要目的是提供一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。通过使用迭代器模式,用户可以遍历任何聚合对象,而无需...

    (行为型模式) Iterator 迭代器模式

    C#面向对象设计模式 (行为型模式) Iterator 迭代器模式 视频讲座下载

    使用Iterator模式将对象转成String (2).pdf

    Iterator模式是一种设计模式,它提供了一种顺序访问聚合对象的元素而不暴露其底层表示的方法。在Java中,Iterator模式常用于遍历集合(如ArrayList、LinkedList等)和Map,使得开发者可以方便地对集合进行操作,而...

    使用Iterator模式将对象转成String.pdf

    Iterator模式是一种设计模式,它允许程序访问集合对象的元素而不暴露其底层表示。在这个场景中,我们关注的是如何使用Iterator模式将对象转换为可读性强的字符串,这在日志记录、调试或输出对象信息时非常有用。我们...

    Java设计模式之Iterator模式介绍

    Iterator模式是一种行为设计模式,它的主要作用是在不暴露容器内部结构的情况下,允许外部代码逐个访问容器中的元素。在Java中,Iterator模式被广泛应用于集合框架,如ArrayList、LinkedList等,使得用户能够方便地...

    设计模式(C#)之迭代器模式(Iterator Pattern)

    迭代器模式是软件设计模式中的一种行为模式,它在C#等面向对象编程语言中有着广泛的应用。这个模式的主要目标是允许用户遍历一个聚合对象(如数组、集合或列表)的所有元素,而无需了解底层的实现细节。下面将详细...

    Java的Iterator模式分页程序

    大体思想:分页的核心思想采用 Iterator模式,每次从数据库中取定量的数据块 其中block和pageCount是两个不同的概念,block是块,规定了从数据库中获取的数量 pageCount为表现层每页显示的数量 另外参数中还包含缓存...

    2022年Java源码分析:深入探讨Iterator模式Java教程.docx

    在Java编程语言中,Iterator模式是一种设计模式,用于在各种数据结构(如集合)中进行迭代操作,使得用户可以顺序地访问集合中的元素,而无需了解底层数据结构的细节。这个模式有效地解耦了集合对象和遍历行为,提供...

    设计模式之迭代器模式(Iterator)

    总的来说,迭代器模式是一种强大的工具,它提高了代码的可读性和可维护性,通过将遍历逻辑从聚合类中分离出来,实现了数据结构与遍历方式的解耦。在开发过程中,合理运用迭代器模式可以使得代码更加灵活且易于扩展。

    VisitorPattern:CS100 Lab8-使用Visitor模式和Iterator模式的操作数计数器的实现

    访客模式 作者:Brian ( ) 您必须一组两个一组地工作 迭代器类 您已经获得了四个文件,其中包含以下五个迭代器类的声明和定义: 迭代器:这是用于定义所有其他迭代器类的接口的基类 NullIterator:此迭代器由...

    IteratorPattern 迭代设计模式

    迭代器模式(IteratorPattern)是设计模式中的一种行为模式,它提供了一种顺序访问聚合对象元素的方法,同时又不暴露其底层表示。这种模式允许我们遍历集合对象的元素,而无需暴露其内部结构。在Java、C#等面向对象...

    Iterator用法

    ### C++中的Iterator模式详解 #### 什么是Iterator模式? 在软件工程中,设计模式是一种用于解决特定问题的通用可重用解决方案。Iterator模式是其中的一种,其主要目标是在不暴露集合内部结构的情况下,为遍历集合...

    F_Java源码分析:深入探讨Iterator模式.doc

    F_Java源码分析:深入探讨Iterator模式

    Iterator Pattern(迭代模式)

    其他文件如`.classpath`、`.project`、`build.xml`、`Workspace.sws`等是Eclipse项目配置文件,它们与迭代模式的理论知识关系不大,主要用于项目的构建和管理。 ### 总结 迭代模式是设计模式中的重要成员,它简化了...

    JavaScript设计模式与开发实践.pdf

    singleton模式、Factory模式、Abstract Factory模式、Builder模式、Prototype模式、Adapter模式、Bridge模式、Composite模式、Decorator模式、...、Interpreter模式、Iterator模式、Mediator模式、Memento模式等...

Global site tag (gtag.js) - Google Analytics