现在的位置: 首页 > 综合 > 正文

23种设计模式(9):访问者模式

2013年10月02日 ⁄ 综合 ⁄ 共 1547字 ⁄ 字号 评论关闭

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

类型:行为类模式

类图:

       访问者模式可能是行为类模式中最复杂的一种模式了,但是这不能成为我们不去掌握它的理由。我们首先来看一个简单的例子,代码如下:

[java] view
plain
copy

  1. class A {  
  2.     public void method1(){  
  3.         System.out.println("我是A");  
  4.     }  
  5.       
  6.     public void method2(B b){  
  7.         b.showA(this);  
  8.     }  
  9. }  
  10.   
  11. class B {  
  12.     public void showA(A a){  
  13.         a.method1();  
  14.     }  
  15. }  

        我们主要来看一下在类A中,方法method1和方法method2的区别在哪里,方法method1很简单,就是打印出一句“我是A”;方法method2稍微复杂一点,使用类B作为参数,并调用类B的showA方法。再来看一下类B的showA方法,showA方法使用类A作为参数,然后调用类A的method1方法,可以看到,method2方法绕来绕去,无非就是调用了一下自己的method1方法而已,它的运行结果应该也是“我是A”,分析完之后,我们来运行一下这两个方法,并看一下运行结果:

[java] view
plain
copy

  1. public class Test {  
  2.     public static void main(String[] args){  
  3.         A a = new A();  
  4.         a.method1();  
  5.         a.method2(new B());  
  6.     }  
  7. }  

运行结果为:

我是A
我是A

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

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

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

[java] view
plain
copy

  1. abstract class Element {  
  2.     public abstract void accept(IVisitor visitor);  
  3.     public abstract void doSomething();  
  4. }  
  5.   
  6. interface IVisitor {  
  7.     public void visit(ConcreteElement1 el1);  
  8.     public void visit(ConcreteElement2 el2);  
  9. }  
  10.   
  11. class

抱歉!评论已关闭.