`
SwineX
  • 浏览: 36263 次
  • 性别: Icon_minigender_1
  • 来自: 常德
社区版块
存档分类
最新评论

Visitor模式的简单实现

阅读更多
1.描述
一个集合中有同一种类型的数据,他们或者继承同一个父类,或者实现了同一个接口,但是他们各自的属性和方法有时却存在着差异,而这些数据一旦被添加进一些集合以后,他们的差异性就被一般化了,若需要再次取得这些具有“个性”的类的话,则要做大量如下的工作:
for(A a : collection){
 if(a instance of B){
//.....
 }else if(a instance of C){
//.....
 }else ....
}

这样的代码就显得异常的繁琐,Visitor模式实际上就是在做与if else 相同的工作,但是他的代码更加飘逸一点。

2.接口定义
两个主要接口:
  ~Visitor
public interface Visitor {
	
	public void visit(StringElement s);
	
	public void visit(IntElement n);
	
	public void visit(DoubleElement d);

}

Visitor定义了不同类型的对象的访问方法


  ~Visitable
public interface Visitable {
	
	public void accept(Visitor visitor);
	
}

Visitable定义的是被访问者接受访问者(也就是实现了visitor)访问的方法,如果实现visitable的对象accept了一个visitor对象,那么visitable就会调用visitor中相应的visit的方法(通过函数重载来实现),做到对visitable内所有可被访问的元素(同样也是实现了visitable)的遍历。(这话说的.....有点绕了...)

3.具体实现类的函数定义如下:
三个实现了visitable接口的元素类:
public class IntElement implements Visitable{

	private int value = 1;
	
	public int getValue(){
		return this.value;
	}
	
	public void accept(Visitor visitor) {
		visitor.visit(this);
	}

}

public class DoubleElement implements Visitable{

private double value = 1.1;

public double getValue(){
return this.value;
}

public void accept(Visitor visitor) {
visitor.visit(this);
}

}


public class StringElement implements Visitable{

	private String value = "I'm String";
	
	public String getValue(){
		return this.value;
	}
	
	public void accept(Visitor visitor) {
		visitor.visit(this);
	}
}


同样是实现了visitable的集合类,visitor对象被这个集合类accept后,visitor便可以以各自的方法来访问这个集合中那些有“个性”的元素了
public class Elements implements Visitable{

	
	private Collection<Visitable> col = new ArrayList();
	
	public void addElement(Visitable v){
		col.add(v);
	}
	
	public void accept(Visitor visitor) {
		for(Visitable v : col){
			v.accept(visitor);
		}
	}	
}


主函数
public static void main(String args[]){
		Elements es = new Elements();
		es.addElement(new StringElement());
		es.addElement(new IntElement());
		es.addElement(new DoubleElement());
		MyVisitor mv = new MyVisitor();
		es.accept(mv);
	}


运行结果:
element.StringElement:I'm String
element.IntElement:1
element.DoubleElement:1.1


先传个uml图上来,画得有点难看而且又点不规范,但是大概的模型就是这样的



4.写在后面:
刚开始接触到visitor模式时,的确有点不懂,后来是用到dom4j的时候,在解析xml文件时,发现dom4j对其提供的visitor模式支持非常好用,只需要创建一个visitor了实现类,给它几个筛选条件,我就能从一个Element中获得我想要的节点信息了,这是才对visitor模式有了一个大概的了解。不懂没关系,敲一敲就会明白的。
  • 大小: 75.2 KB
分享到:
评论

相关推荐

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

    在`Demo18_Visitor`中,我们可以看到一个具体的访问者模式实现示例,通过阅读源代码,可以更好地理解访问者模式的运作机制。代码通常会展示如何定义和使用访问者接口,以及如何在元素类中调用`accept`方法以执行特定...

    C++ Visitor模式

    下面是一个简单的C++ Visitor模式实现,假设我们有一个`Shape`接口,有`Circle`和`Rectangle`两种具体形状,我们希望实现一个`Printer`访问者来打印形状的信息。 ```cpp class Shape { public: virtual void ...

    基于visitor模式和访问者模式的表达式树_求值引擎

    本项目基于“visitor模式”和“访问者模式”,实现了用于计算表达式的求值引擎,这涉及到一种将数学表达式转化为数据结构(表达式树)的方法,然后通过遍历该树来执行计算。下面我们将详细探讨这些概念。 1. **...

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

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

    C#设计模式之Visitor

    **二、Visitor模式的核心概念** 1. **元素对象(Element)**:这是被访问的对象,它们构成一个对象结构,通常包含接受访问者的方法。 2. **访问者(Visitor)**:定义了对每个元素的访问操作接口。每个具体访问者...

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

    **访问者模式(Visitor Pattern)**是一种行为设计模式,它提供了一种在不修改对象结构的情况下增加新操作的方法。这种模式的主要思想是将数据结构与算法分离,使得算法可以在不改变对象结构的情况下独立变化。 在...

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

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

    GoF+23种设计模式解析附C++实现源码(2nd+Edition).pdf

    **C++实现**: 在C++中实现Visitor模式通常涉及定义一个Visitor接口和多个具体的Visitor类。此外,还需要修改Element类,使其接受Visitor的访问。 #### 3.9 Chain of Responsibility模式 **定义**: Chain of ...

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    - **3.8 Visitor模式**:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 - **应用场景**:一个对象结构包含很多类对象,它们有不同的接口,而你想...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    8. **Visitor模式** - **定义**:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 - **应用场景**:一个对象结构包含很多类对象,它们有不同的...

    实例讲解iOS应用的设计模式开发中的Visitor访问者模式

    访问者模式(Visitor Pattern)是一种行为设计模式,它在对象结构中定义了一个访问者的接口,使得该访问者能访问该结构中的元素,并执行特定的操作,而不会破坏对象结构。这种模式将数据结构与操作分离,增加了系统...

    23种设计模式解析附C++实现

    8. Visitor模式,表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 9. ChainofResponsibility模式,为解除请求的发送者和接收者之间的耦合,而使多个...

    各种设计模式的实现方法示例

    `Visitor`模式将操作行为添加到对象结构中,使得可以对对象进行新的操作而无需修改原有类。在Java中,通常会定义一个访问者接口,每个对象节点实现该接口,提供接受访问者的方法。 `Strategy`模式定义了一系列算法...

    23种设计模式JAVA实现,例子通俗易懂

    16. **访问者模式(Visitor)**:表示一个作用于某对象结构中的各元素的操作。它可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 17. **状态模式(State)**:允许对象在其内部状态改变时改变其行为,...

    C++面向对象23种设计模式实现源码DesignPattern.zip

    解释器模式Interpretor中,可以看到如何通过组合简单元素来构建复杂的表达式解析过程,这在需要自定义语法或表达式求值的场景中十分有用。 2. **迭代子模式(Iterator Pattern)**:迭代子模式提供了遍历集合对象的...

    Reflect on the Visitor design pattern

    【Visitor设计模式详解】 访问者模式(Visitor设计模式)是一种行为设计模式,它提供了一种在不修改对象结构的情况下对对象进行操作的方式。这个模式的主要目的是将算法与数据结构分离,使得算法可以在不改变对象...

Global site tag (gtag.js) - Google Analytics