visitor访问者模式及dom4j中使用(一)

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的不同子类可以有多种,这样使用访问者模式最方便,当系统中存在着固定的数据结构,且有着不同的行为,访问者模式也许是个不错的选择

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值