首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Visitor方式的简单实现

2012-10-27 
Visitor模式的简单实现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 Stringelement.IntElement:1element.DoubleElement:1.1


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



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

热点排行