- 浏览: 90016 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
Ginger90:
其实大部分功能和帆软报表差不多,但是帆软报表编写起来更方便一些 ...
iReport+jasperReport之JFreeChart(图表报表) -
tiancaishan:
这只是最简单的主数据源,那子数据源怎么设置呢?
iReport+jasperReport之CSV、XML数据源 -
wangqiangcattsoft:
楼上源码只看了一半
Struts2整合JasperReport预览HTML格式不显示图片问题解决方案 -
tuan232311009:
不错!
黑莓开发学习入门系列,自己动手实现一个日历软件(六)
Visitor访问者模式---------学习dom4j时遇到的顺便拿来交流
dom4j遍历xml文档树有种很特别的方式就是访问者(Visitor)模式,初次接触Visitor模式,写出个人理解大家交流!
Visitor访问者模式定义:作用于某个对象树中各个对象的操作. 它可以使你在不改变这些对象树本身的情况下,定义作用于这些对象树各个节点的新操作。
先看以下代码:Person为简单的vo类
我们使用了 instanceof来判断 Object对象 o 的类型,这样做的缺点是代码中If/else if 很繁琐,而JDK中的范型又限制了只能使用相同的类型,这时Vistor访问模式派上用场了。
当我们要访问Collection的每一个Element(被访问者)时,定义一个accept操作使其具有可被访问性,我们定义一个Visiable接口,使Collection的每一个Element继承这个接口,实现自身的访问操作
下来定义一个访问者Visitor接口,它可以访问Integer,String,Person(VO对象),Collection类型
Visitor访问者模式定义:作用于某个对象树中各个对象的操作. 它可以使你在不改变这些对象树本身的情况下,定义作用于这些对象树各个节点的新操作。
先看以下代码:Person为简单的vo类
package org.bulktree.visitor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
/** *//**
*
* @author bulktree Email: laoshulin@gmail.com
* @date Aug 10, 2008
*/
public class ReadCollection {
private Collection c = null;
ReadCollection() {
/**//*
* 准备数据-String对象-Person对象-Integer对象-List对象
*/
String str = "bulktree.laoshulin";
Person person = new Person("bulktree", "22", "M");
Integer a = new Integer(99);
/**//*
* 使用范型
*/
List<String> list = new ArrayList<String>();
list.add("BULKTREE");
list.add("LAOSHULIN");
list.add("OAKERTREE");
c = new ArrayList();
c.add(str);
c.add(person);
c.add(a);
c.add(list);
}
/** *//**
* 遍历Collection中的每一个对象并打印
*/
public void testCollection() {
Iterator iter = getCollection().iterator();
while (iter.hasNext()) {
Object o = iter.next();
if (o instanceof String) {
System.out.println("String--> " + o.toString());
} else if (o instanceof Person) {
readPerson((Person) o);
} else if (o instanceof Integer) {
Integer inta = (Integer) o;
System.out.println(inta.intValue());
} else if (o instanceof List) {
readList((List) o);
}
}
}
public Collection getCollection() {
return c;
}
private void readPerson(Person person) {
System.out.println("person-name-> " + person.getName());
System.out.println("person-age-> " + person.getAge());
System.out.println("person-sex-> " + person.getSex());
}
private void readList(List<String> list) {
/**//*
* 增强的for循环
*/
for (String s : list) {
System.out.println(s);
}
}
public static void main(String[] args) {
new ReadCollection().testCollection();
}
}
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
/** *//**
*
* @author bulktree Email: laoshulin@gmail.com
* @date Aug 10, 2008
*/
public class ReadCollection {
private Collection c = null;
ReadCollection() {
/**//*
* 准备数据-String对象-Person对象-Integer对象-List对象
*/
String str = "bulktree.laoshulin";
Person person = new Person("bulktree", "22", "M");
Integer a = new Integer(99);
/**//*
* 使用范型
*/
List<String> list = new ArrayList<String>();
list.add("BULKTREE");
list.add("LAOSHULIN");
list.add("OAKERTREE");
c = new ArrayList();
c.add(str);
c.add(person);
c.add(a);
c.add(list);
}
/** *//**
* 遍历Collection中的每一个对象并打印
*/
public void testCollection() {
Iterator iter = getCollection().iterator();
while (iter.hasNext()) {
Object o = iter.next();
if (o instanceof String) {
System.out.println("String--> " + o.toString());
} else if (o instanceof Person) {
readPerson((Person) o);
} else if (o instanceof Integer) {
Integer inta = (Integer) o;
System.out.println(inta.intValue());
} else if (o instanceof List) {
readList((List) o);
}
}
}
public Collection getCollection() {
return c;
}
private void readPerson(Person person) {
System.out.println("person-name-> " + person.getName());
System.out.println("person-age-> " + person.getAge());
System.out.println("person-sex-> " + person.getSex());
}
private void readList(List<String> list) {
/**//*
* 增强的for循环
*/
for (String s : list) {
System.out.println(s);
}
}
public static void main(String[] args) {
new ReadCollection().testCollection();
}
}
我们使用了 instanceof来判断 Object对象 o 的类型,这样做的缺点是代码中If/else if 很繁琐,而JDK中的范型又限制了只能使用相同的类型,这时Vistor访问模式派上用场了。
当我们要访问Collection的每一个Element(被访问者)时,定义一个accept操作使其具有可被访问性,我们定义一个Visiable接口,使Collection的每一个Element继承这个接口,实现自身的访问操作
package org.bulktree.visitor;
/** *//**
* 可访问性--接收一个访问者
* @author bulktree Email: laoshulin@gmail.com
* @date Aug 10, 2008
*/
public interface Visitable {
public void accept(Visitor visitor);
}
/** *//**
* 可访问性--接收一个访问者
* @author bulktree Email: laoshulin@gmail.com
* @date Aug 10, 2008
*/
public interface Visitable {
public void accept(Visitor visitor);
}
下来是四个被访问的类型String,Integer,Person,Collection的实现类
package org.bulktree.visitor;
/** *//**
* 被访问者--String对象
* @author bulktree Email: laoshulin@gmail.com
* @date Aug 10, 2008
*/
public class StringElement implements Visitable {
private String str;
public StringElement(String str) {
this.str = str;
}
public String getStr() {
return str;
}
public void accept(Visitor visitor) {
visitor.visitString(this);
}
}
/** *//**
* 被访问者--String对象
* @author bulktree Email: laoshulin@gmail.com
* @date Aug 10, 2008
*/
public class StringElement implements Visitable {
private String str;
public StringElement(String str) {
this.str = str;
}
public String getStr() {
return str;
}
public void accept(Visitor visitor) {
visitor.visitString(this);
}
}
package org.bulktree.visitor;
/** *//**
* 被访问者--Integer对象
* @author bulktree Email: laoshulin@gmail.com
* @date Aug 10, 2008
*/
public class IntegerElement implements Visitable {
private Integer i;
public IntegerElement(Integer i) {
this.i = i;
}
public Integer getI() {
return i;
}
public void accept(Visitor visitor) {
visitor.visitInteger(this);
}
}
/** *//**
* 被访问者--Integer对象
* @author bulktree Email: laoshulin@gmail.com
* @date Aug 10, 2008
*/
public class IntegerElement implements Visitable {
private Integer i;
public IntegerElement(Integer i) {
this.i = i;
}
public Integer getI() {
return i;
}
public void accept(Visitor visitor) {
visitor.visitInteger(this);
}
}
package org.bulktree.visitor;
import java.util.Collection;
/** *//**
* 被访问者--Person对象
* @author bulktree Email: laoshulin@gmail.com
* @date Aug 10, 2008
*/
public class PersonElement implements Visitable{
private Person p;
public PersonElement(Person p) {
this.p = p;
}
public Person getP() {
return p;
}
public void accept(Visitor visitor) {
visitor.visitPerson(this);
}
}
import java.util.Collection;
/** *//**
* 被访问者--Person对象
* @author bulktree Email: laoshulin@gmail.com
* @date Aug 10, 2008
*/
public class PersonElement implements Visitable{
private Person p;
public PersonElement(Person p) {
this.p = p;
}
public Person getP() {
return p;
}
public void accept(Visitor visitor) {
visitor.visitPerson(this);
}
}
package org.bulktree.visitor;
import java.util.Collection;
import java.util.List;
/** *//**
* 被访问者--Collection对象
* @author bulktree Email: laoshulin@gmail.com
* @date Aug 10, 2008
*/
public class CollectionElement implements Visitable {
private Collection collection;
public CollectionElement(Collection collection) {
this.collection = collection;
}
public Collection getCollection() {
return collection;
}
public void accept(Visitor visitor) {
visitor.visitCollection(collection);
}
}
import java.util.Collection;
import java.util.List;
/** *//**
* 被访问者--Collection对象
* @author bulktree Email: laoshulin@gmail.com
* @date Aug 10, 2008
*/
public class CollectionElement implements Visitable {
private Collection collection;
public CollectionElement(Collection collection) {
this.collection = collection;
}
public Collection getCollection() {
return collection;
}
public void accept(Visitor visitor) {
visitor.visitCollection(collection);
}
}
下来定义一个访问者Visitor接口,它可以访问Integer,String,Person(VO对象),Collection类型
border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-
发表评论
-
如何使用Static的变量和方法
2007-12-01 10:55 711如何使用Static的变量和方法有时你希望定义一个类成员 ... -
Transact-SQL简明语法
2007-12-01 11:02 1026最简单的查询语法格式: SELECT <列名&g ... -
去北京面试时的题目(老师生日)微软面试题
2007-12-01 19:59 1180小明和小强都是张老师的学生,张老师的生日是 M月 N日, 2人 ... -
有点象24点游戏,说说你的想法
2007-12-01 23:02 752* 5、5、5、1怎么能算出24呢? * ... -
JDK5增强for循环的使用
2007-12-02 23:43 784JDK5增强for循环的使用,此语法有很大的缺陷,仅适用于有限 ... -
Java中的多态
2007-12-03 11:26 791在实际操作中,多态可以让我不用关心某个对象到底是什么具体类型, ... -
运用线程实现时间更新
2007-12-06 11:01 750线程的做的时间表,不知道合不合适,哪位还有更好的实现方式(ja ... -
生产者消费者问题(以面包为例)
2007-12-10 19:48 760package Thread;public class Pr ... -
数据库关系表解决方案
2007-12-26 21:45 738数据库关系的表之间定义一个连接,而所定义连接的方式由表之 ... -
Struts2表单请求流程(一)
2007-12-29 20:09 855Struts2框架出来有段时间了,终于开始学习Struts了, ... -
Struts2表单请求流程(二)— Struts2高级的POJO访问
2007-12-29 20:20 1935此文主要来自www.blogjava.net/Max的实例 S ... -
开源软件逐渐走进了我的生活
2008-03-18 21:58 735看看我们经常用的软件吧! 以前经常去找一些破解的软件用,没有那 ... -
Struts2中select/doubleselect标签数据显示
2008-04-02 08:46 1089最近做毕业设计用到Struts2 的标签库,遇到一些比较复 ... -
用commons-email-1.1.jar实现发邮件功能:
2008-04-07 09:47 1085今天在Apache网站上下载commons-lang j ... -
JFreeChart简单使用
2008-04-18 09:29 874JFreeChart is a free chart libr ... -
Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2008-04-18 13:59 894Spring2.5.3+Hibernate3.2+Struts ... -
java截取字符串的一些常用处理
2008-08-01 09:06 956java对字符串处理功能强大,以下是本人实际开发中用到的一些总 ... -
dom4j操作xml基础
2008-08-03 15:39 959DOM是用与平台和语言无关的方式表示XML文档 ... -
office javaScript调试工具
2008-08-05 18:21 913项目前台需要写大量的js,寻求一种有效 ... -
dom4j操作xml基础--Visitor访问模式解析XML
2008-08-10 12:52 968废话不说了,看了上篇Visitor访问者模式--------- ...
相关推荐
对象结构不关心访问者,但它需要提供一个方法,允许访问者访问其包含的元素,如`accept(Visitor)`。 在实际使用中,访问者模式适用于以下场景: - 当需要对一个对象结构中的元素执行多种操作,且这些操作独立于对象...
**访问者模式(Visitor)详解** 访问者模式是一种行为设计模式,它使你可以在不修改对象结构的情况下,为对象添加新的操作。这种模式的核心在于将数据结构与对这些数据的操作解耦,使得增加新的操作变得容易,同时...
### C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式 #### 概述 在本篇文章中,我们将深入探讨面向对象设计模式中的一个非常重要的模式——**Visitor(访问者)模式**。此模式属于行为型模式的一...
5. 对象结构(Object Structure):可以遍历其元素并接受访问者,它通常提供一个方法让访问者访问其元素,比如一个accept()方法。 访问者模式的应用场景包括: 1. 当你需要在不改变元素类的情况下,为元素类增加新...
### 设计模式-访问者(Visitor)模式详解和应用 #### 一、访问者模式简介 访问者模式(Visitor Pattern)是一种行为型设计模式,它允许我们向一组已存在的类添加新的行为,而无需修改这些类。这种模式的核心思想是在...
8. **文档遍历**:通过Visitor模式,DOM4J提供了遍历整个XML文档的机制,可以方便地实现自定义的遍历逻辑。 9. **性能优化**:DOM4J设计了许多优化策略,如延迟加载、节点缓存等,以提高处理大型XML文档的效率。 ...
在本文中,我们将深入探讨DOM4J的使用示例、XPP3解析器以及DOM4J中的Visitor模式。 1. DOM4J基本使用: - 创建XML文档:DOM4J提供了Element、Attribute、Text等类来构建XML结构。例如,可以创建一个新的Element...
### DOM4j 教程详解 #### 一、概述 DOM4j是一个高效且易于使用的开源库,专门设计用于在Java平台上处理XML、XPath和XSLT。...无论是对于初学者还是有经验的开发者来说,DOM4J都是一个值得学习和掌握的重要工具。
16. **Visitor**: 实现了访问者模式,允许对DOM4J树进行深度遍历,并在每个节点上执行特定的操作。 17. **XPath**: 提供了XPath表达式的查询能力,使得在复杂的数据结构中定位和提取数据变得更加容易。 #### 三、...
4. **符合单一职责原则**:访问者模式把相关的行为封装在一起,构成一个访问者,使每一个访问者的功能都比较单一。 **缺点**: 1. **增加新的元素很困难**:如果需要增加一个新的元素,则需要修改所有已有的访问者...
16. **Visitor**: 用于实现访问者模式。 17. **XPath**: 在分析一个字符串后会提供一个XPath表达式。 这些接口之间的继承关系如图所示: ```plaintext interface java.lang.Cloneable interface org.dom4j.Node |...
DOM4J 的使用 DOM4J 是一个开源的 XML 解析包,由 dom4j.org 出品,应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM、SAX 和 JAXP。DOM4J 的主要特点是使用大量的接口,所有主要接口都在 org.dom4j 里面定义...
总结来说,访问者模式是一种在不改变对象结构的情况下,向对象结构添加新操作的设计模式。通过定义访问者接口和元素接口,以及具体的访问者和元素实现,我们可以灵活地扩展系统的功能,同时保持结构的稳定。然而,...
C#面向对象设计模式 (行为型模式) Visitor 访问者模式 视频讲座下载
- **Visitor**:用于实现访问者模式,可以遍历DOM4j中的节点。 - **XPath**:提供了XPath表达式的解析和查询功能。 这些接口之间的继承关系清晰明了,大部分接口都是从`Node`接口继承而来的。了解这些接口之间的...
访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。...
DOM4J支持Visitor模式,这是一种常用的模式,允许对文档中的节点进行访问操作而不暴露文档的具体结构。通过实现`org.dom4j.Visitor`接口或使用`org.dom4j.visitor.AbstractVisitor`,可以自定义访问逻辑。 ```java ...