`
阅读更多
    dom4j遍历xml文档树有种很特别的方式就是访问者(Visitor)模式,初次接触Visitor模式,写出个人理解大家交流!
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();
    }

}


    我们使用了
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);
}
 

下来是四个被访问的类型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);
    }

}

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);

    }

}

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);
    }

}

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);
    }

}


下来定义一个访问者
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-
分享到:
评论

相关推荐

    设计模式C++学习之访问者模式(Visitor)

    对象结构不关心访问者,但它需要提供一个方法,允许访问者访问其包含的元素,如`accept(Visitor)`。 在实际使用中,访问者模式适用于以下场景: - 当需要对一个对象结构中的元素执行多种操作,且这些操作独立于对象...

    设计模式之访问者模式(Visitor)

    **访问者模式(Visitor)详解** 访问者模式是一种行为设计模式,它使你可以在不修改对象结构的情况下,为对象添加新的操作。这种模式的核心在于将数据结构与对这些数据的操作解耦,使得增加新的操作变得容易,同时...

    C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式

    ### C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式 #### 概述 在本篇文章中,我们将深入探讨面向对象设计模式中的一个非常重要的模式——**Visitor(访问者)模式**。此模式属于行为型模式的一...

    Dom4j的使用(全而好的文章)

    16. **Visitor**: 实现了访问者模式,用于遍历DOM树并对节点执行特定操作。 17. **XPath**: 提供了XPath表达式的分析和查询功能。 #### 四、Dom4j的接口继承关系 - `java.lang.Cloneable`: Java标准接口,用于克隆...

    设计模式-访问者模式(Visitor)

    5. 对象结构(Object Structure):可以遍历其元素并接受访问者,它通常提供一个方法让访问者访问其元素,比如一个accept()方法。 访问者模式的应用场景包括: 1. 当你需要在不改变元素类的情况下,为元素类增加新...

    dom4j简单技术

    - **Visitor**:用于实现访问者模式,遍历和操作DOM树。 - **XPath**:解析XPath表达式。 #### 使用案例:解析与创建XML文档 DOM4J的使用十分直观,以下示例展示了如何使用DOM4J解析XML文档: ```java import org...

    设计模式-访问者(Visitor)模式详解和应用.pdf

    ### 设计模式-访问者(Visitor)模式详解和应用 #### 一、访问者模式简介 访问者模式(Visitor Pattern)是一种行为型设计模式,它允许我们向一组已存在的类添加新的行为,而无需修改这些类。这种模式的核心思想是在...

    dom4j学习资料

    8. **文档遍历**:通过Visitor模式,DOM4J提供了遍历整个XML文档的机制,可以方便地实现自定义的遍历逻辑。 9. **性能优化**:DOM4J设计了许多优化策略,如延迟加载、节点缓存等,以提高处理大型XML文档的效率。 ...

    dom4j的例子,xpp3

    在本文中,我们将深入探讨DOM4J的使用示例、XPP3解析器以及DOM4J中的Visitor模式。 1. DOM4J基本使用: - 创建XML文档:DOM4J提供了Element、Attribute、Text等类来构建XML结构。例如,可以创建一个新的Element...

    dom4j教程.pdf

    ### DOM4j 教程详解 #### 一、概述 DOM4j是一个高效且易于使用的开源库,专门设计用于在Java平台上处理XML、XPath和XSLT。...无论是对于初学者还是有经验的开发者来说,DOM4J都是一个值得学习和掌握的重要工具。

    dom4j解析xml详解

    16. **Visitor**: 实现了访问者模式,允许对DOM4J树进行深度遍历,并在每个节点上执行特定的操作。 17. **XPath**: 提供了XPath表达式的查询能力,使得在复杂的数据结构中定位和提取数据变得更加容易。 #### 三、...

    软件设计与体系结构-设计模式-访问者模式-ppt制作

    4. **符合单一职责原则**:访问者模式把相关的行为封装在一起,构成一个访问者,使每一个访问者的功能都比较单一。 **缺点**: 1. **增加新的元素很困难**:如果需要增加一个新的元素,则需要修改所有已有的访问者...

    DOM4J_xpath

    16. **Visitor**: 用于实现访问者模式。 17. **XPath**: 在分析一个字符串后会提供一个XPath表达式。 这些接口之间的继承关系如图所示: ```plaintext interface java.lang.Cloneable interface org.dom4j.Node |...

    DOM4J 的使用

    DOM4J 的使用 DOM4J 是一个开源的 XML 解析包,由 dom4j.org 出品,应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM、SAX 和 JAXP。DOM4J 的主要特点是使用大量的接口,所有主要接口都在 org.dom4j 里面定义...

    设计模式 - 访问者模式

    总结来说,访问者模式是一种在不改变对象结构的情况下,向对象结构添加新操作的设计模式。通过定义访问者接口和元素接口,以及具体的访问者和元素实现,我们可以灵活地扩展系统的功能,同时保持结构的稳定。然而,...

    (行为型模式) Visitor 访问者模式

    C#面向对象设计模式 (行为型模式) Visitor 访问者模式 视频讲座下载

    DOM4j教程 例子

    - **Visitor**:用于实现访问者模式,可以遍历DOM4j中的节点。 - **XPath**:提供了XPath表达式的解析和查询功能。 这些接口之间的继承关系清晰明了,大部分接口都是从`Node`接口继承而来的。了解这些接口之间的...

    访问者模式(Visitor Pattern) 1. 访问者模式概述 1.1 定义 1.2 基本思想 2. 访问者模式的结构 3. 访问者模式的UML类图 4. 访问者模式的工作原理 5. Java实现

    访问者模式(Visitor Pattern) 1. 访问者模式概述 1.1 定义 1.2 基本思想 2. 访问者模式的结构 3. 访问者模式的UML类图 4. 访问者模式的工作原理 5. Java实现示例 5.1 基本实现示例 5.2 访问者模式处理复杂对象层次...

    dom4j的使用教程

    16. `Visitor`:实现访问者模式,允许自定义的节点遍历行为。 17. `XPath`:提供XPath表达式的解析和执行,用于查询XML文档。 DOM4J的接口设计遵循了面向接口编程的原则,通过接口的继承和组合,构建了一套灵活且可...

    Dom4j使用简介.pdf

    - **易用性**:Dom4j 的设计考虑到了开发者的需求,提供了简洁明了的 API 接口,使得即使是初学者也能快速上手。 - **高性能**:根据 IBM developer 社区的一项性能对比研究显示,Dom4j 在多项测试中表现优异,这...

Global site tag (gtag.js) - Google Analytics