23种设计模式(16)java访问者模式

  

23种设计模式第十六篇:java访问者模式

  

定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

  

类型:行为类模式

  

类图:   

 23种设计模式(16)java访问者模式”> <br/>
  </p>
  <p>访问者模式可能是行为类模式中最复杂的一种模式了,但是这不能成为我们不去掌握它的理由。</p>
  <p>我们首先来看一个简单的例子,代码如下<br/>
  </p>
  
  <pre类=   A类{   公共空间method1 () {   System.out.println(“我是”);   }      公共空间method2 (B B) {   b.showA(这个);   }   }      B类{   公共空间昭和(一){   a.method1 ();   }   }   之前      

我们主要来看一下在类中,方法method1和方法method2的区别在哪里,方法method1很简单,就是打印出一句”我是一个“;方法method2稍微复杂一点,使用类B作为参数,并调用B类的昭和方法。

  

再来看一下类B的昭和方法,昭和方法使用类一个作为参数,然后调用类一个的method1方法,可以看的到,method2方法绕来绕去,无非就是调用了一下自己的method1方法而已,它的运行结果应该也是“我是”,分析完之后,我们来运行一下这两个方法,并看一下运行结果:
  

        公共类测试{   公共静态void main (String [] args) {   一个=new ();   a.method1 ();   一个。method2(新的B ());   }   }   之前      

运行结果为:

  

  

,,,,,,看懂了这个例子,就理解了访问者模式的90%,在例子中,对于类一个来说,B类就是一个访问者。但是这个例子并不是访问者模式的全部,虽然直观,但是它的可扩展性比较差,下面我们就来说一下访问者模式的通用实现,通过类图可以看的到,在访问者模式中,主要包括下面几个角色:

  

<>强抽象访问者:强抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是访问方法中的参数定义哪些对象是可以被访问的。
  <强>访问者:强实现抽象访问者所声明的方法,它影响到访问者访问到一个类后该干什么,要做什么事情。
  <>强抽象元素类:接口或者抽象类,声明接受哪一类访问者访问,程序上是通过接受方法中的参数来定义的。抽象元素一般有两类方法,一部分是本身的业务逻辑,另外就是允许接收哪类访问者来访问。
  <强>元素类:强实现抽象元素类所声明的接受方法,通常都是visitor.visit(这),基本上已经形成一种定式了。
  <强>结构对象:一个元素的容器,一般包含一个容纳多个不同类,不同接口的容器,如列表,设置,地图等,在项目中一般很少抽象出这个角色。

  

访问者模式的通用代码实现
  

        抽象类元素{   公共抽象空洞接受(IVisitor游客);   公共抽象空洞doSomething ();   }      接口IVisitor {   公共空间访问(ConcreteElement1 el1);   公共空间访问(ConcreteElement2 el2);   }      类ConcreteElement1扩展元素{   公共空间doSomething () {   System.out.println(“这是元素1 ");   }      公共空间接受(IVisitor访问者){   visitor.visit(这个);   }   }      类ConcreteElement2扩展元素{   公共空间doSomething () {   System.out.println(“这是元素2”);   }      公共空间接受(IVisitor访问者){   visitor.visit(这个);   }   }   类访问者实现IVisitor {      公共空间访问(ConcreteElement1 el1) {   el1.doSomething ();   }      公共空间访问(ConcreteElement2 el2) {   el2.doSomething ();   }   }      类ObjectStruture {   公共静态ListgetList () {   List列表=new ArrayList ();   随机跑=new随机();   for (int i=0;i<10;我+ +){   int=ran.nextInt (100);   如果(a> 50) {   列表。添加(新ConcreteElement1 ());   其他}{   列表。添加(新ConcreteElement2 ());   }   }   返回列表;   }   }      公共类客户{   公共静态void main (String [] args) {   List=ObjectStruture.getList列表();   (元素e:列表){   e。接受(新访客());   }   }   }   之前      

23种设计模式(16)java访问者模式