dom4j遍历xml树的方法中有一种visitor模式,写一下自己对isitor模式的理解。
拿城管来打个比方吧,市场是一个很大的collection,里面有卖煎饼果子的(pizza),有卖铁板鱿鱼的(BBQ),有卖包包的(bag)......
public class MarkCollection{
Collection c=null;
MarkCollection(){
Pizza p=new Pizza("荞麦面","鸡蛋","薄脆");
BBQ b=new BBQ("鱿鱼","辣酱");
Bag bg=new Bag("假皮");
c=new Arraylist();
c.add(p);
c.add(b);
c.add(bg);
}
public Collection getCollection(){
return c;
}
}
城管这个visitor,制定了管理pizza,bbq,bag的规定,经营pizza的要交双黄蛋的煎饼果子,BBQ的要交大鱿鱼,bag的要交GUCCI......
public interface Visitor{
public void visit(Pizza p);
public void visit(BBQ b);
public void visit(Bag bg);
}
public class MarkVisitor implements Visitor{
public void visit(Pizza p){
p.getPizza();
}
public void visit(BBQ b){
b.getBBQ();
}
public void visit(Bag bg){
bg.getBag();
}
//管理市场的方法
public void visit(MarkCollection mc){
Collection c=mc.getCollection();
Iterator itr=c.iterator();
while(itr.hasNext()){
Object o=itr.next();
if(o instanceOf Visitable){
((Visitable)o).accept(this);
}
}
}
}
当然无商不j的经营者也有专门的对策,鸡蛋是臭的,鱿鱼是泡大的,GUCCI是高仿的
public interface Visitable{
public void accept(Visitor v);
}
public class Pizza implements Visitable{
//此方法负责对付城管
public void getPizza(){
//返回臭蛋煎饼果子
}
public void accept(Visitor v){
v.visit(this);
}
}
public class BBQ implements Visitable{
public void getBBQ(){
//返回鱿鱼
}
public void accept(Visitor v){
v.visit(this);
}
}
public class Bag implements Visitable{
public void getBag(){
//返回GUCCI
}
public void accept(Visitor v){
v.visit(this);
}
}
好了,上有政策下有对策都准备好了,城管开进市场,商贩做好防御!
public class VisitorTest{
public static void main(String args[]){
MarkCollection mc=new MarkCollection();
Visitor v=new MarkVisitor();
v.visit(mc);
//很简单,城管扫荡市场完毕
}
}
下面我们来看一下,没有使用visitor模式,如何管理市场
publi class NoVisitorTest(){
public void static main(String args[]){
MarkCollection mc=new MarkCollection();
Iterator iter = mc.getCollection().iterator();
while(iter.hasNext()){
Object o=iter.next();
if(o instanceof Pizza){
}else if(o instanceof BBQ){
}else if(o instanceof Bag){
}
}
}
}
使用if else if嵌套,复杂度增加,而且代码灵活度降低。
使用访问者模式的前提是对象群结构中(Collection) 中的对象类型很少改变,在两个接口Visitor(访问)和Visitable(可访问)中,确保Visitable很少变化,也就是说,确保不能有新的元素类型加进来,可以变化的是访问者行为或操作,也就是Visitor的不同子类可以有多种,这样使用访问者模式最方便,当系统中存在着固定的数据结构,且有着不同的行为,访问者模式也许是个不错的选择