Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自

己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广

泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Visitor(访问者)模

式是比较常用的一个模式.

   应用场景:对于某对象结构中各元素的操作。如果需要在不修改各元素类的前提

下定义作用于这些元素的新操作,也就是动态的增加新的方法应该考虑访问者模式。

   想让数个不同的访问者对同一个对象集合进行访问时,Visitor模式可以发挥它

的强大作用。Visitor先调用了Visitable类中的方法,这个方法又回调到Visitor类中


   在此写了7个java类来描述说明Visitor设计模式;
  1、 NodeA.java  可访问节点A
  2、 NodeB.java  可访问节点B
  3、 NodeC.java  可访问节点C
  4、 Visitable.java 可访问对象接口
  5、 Visitor.java  访问者接口
  6、 VisitorA.java  访问者A

  7、 VisitorTest.java  带有main方法的测试类

===============   1、 NodeA.java
package visitor;
public class NodeA implements Visitable {
  public void accept(Visitor visitor) {
    visitor.visit(this);
  }
}
===============   1 end

===============   2、 NodeB.java
package visitor;
public class NodeB implements Visitable {
  public void accept(Visitor visitor) {
    visitor.visit(this);
  }
}
===============   2 end

===============   3、 NodeC.java
package visitor;
public class NodeC implements Visitable {
  public void accept(Visitor visitor) {
    visitor.visit(this);
  }
}
===============   3 end

===============   4、 Visitable.java
package visitor;
public interface Visitable {
   public void accept(Visitor visitor);
}
===============   4 end

===============   5、 Visitor.java
package visitor;
import java.util.Collection;
public interface Visitor {
  //访问节点A
  public void visit(NodeA nodeA);
  //访问节点B
  public void visit(NodeB nodeB);
  //访问节点C
  public void visit(NodeC nodeC);
  //访问节点集合
  public void visitCollection(Collection  collection);
}
===============   5 end

===============   6、 VisitorA.java
package visitor;
import java.util.Collection;
import java.util.Iterator;
public class VisitorA implements Visitor {
  public void visit(NodeA a){
    System.out.println("Execute visitNodeA method!");;
  }
  public void visit(NodeB b){
    System.out.println("Execute visitNodeB method!");;
  }
  public void visit(NodeC c){
    System.out.println("Execute visitNodeC method!");;
  }
  public void visitCollection(Collection collection){
    Iterator iterator = collection.iterator();
    while (iterator.hasNext()) {
      Object o = iterator.next();
      if (o instanceof Visitable)
        ((Visitable)o).accept(this);
      }
  }
}
===============   6 end

===============   7、 VisitorTest.java
package visitor;
import java.util.ArrayList;
import java.util.List;
public class VisitorTest {
  public static void main(String[] args) {
    NodeA nodeA = new NodeA();
    NodeB nodeB = new NodeB();
    NodeC nodeC = new NodeC();
    VisitorTest nodeD = new VisitorTest();
    //访问单个对象
    VisitorA visitorA = new VisitorA();
    visitorA.visit(nodeA);
    visitorA.visit(nodeB);
    visitorA.visit(nodeC);
    //访问集合
    List<Visitable> list = new ArrayList<Visitable>();
    list.add(nodeA);
    list.add(nodeB);
    list.add(nodeC);
    visitorA.visitCollection(list);
  }
}
===============   7 end

在两个接口Visitor和Visitable中,确保Visitable很少变化,也就是说,确保不能

老有新的Element元素类型加进来,可以变化的是访问者行为或操作,也就是

Visitor的不同子类可以有多种,这样使用访问者模式最方便.


java设计模式---访问者模式的更多相关文章

  1. JAVA 设计模式 访问者模式

    用途 访问者模式 (Visitor) 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式是一种行为型模式. 用途

  2. Java设计模式—访问者模式

    原文地址:http://www.cnblogs.com/java-my-life/archive/2012/06/14/2545381.html 总结的太棒啦,导致自己看了都不想总结了...... 在 ...

  3. Java设计模式-访问者模式(Visitor)

    访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化.访问者模式适用于数据结构相对稳定算法又易变化的系统.因为访问者模式使得算法操作增加变得容易.若系统数据结构对象易于变化,经 ...

  4. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  5. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  6. java设计模式--单列模式

    java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...

  7. 3.java设计模式-建造者模式

    Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...

  8. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  9. Java设计模式——外观模式

    JAVA 设计模式 外观模式 用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构

随机推荐

  1. Mysql优化--慢查询日志

    Mysql 系列文章主页 =============== 默认没有开启慢查询日志功能.如果不是调优需要的话,一般不建议开启. 查看是否开启慢查询日志: SHOW VARIABLES LIKE '%sl ...

  2. 剑指架构师系列-MySQL调优

    介绍MySQL的调优手段,主要包括慢日志查询分析与Explain查询分析SQL执行计划 1.MySQL优化 1.慢日志查询分析 首先需要对慢日志进行一些设置,如下: SHOW VARIABLES LI ...

  3. ES6(类)

    类的概念 1.基本定义 2.继承 继承如何传递参数?(super) 定义自己属性的时候调用 this 一定要在 super 之后(在继承关系中,子类的构造函数如果用 super 传递参数的过程中,su ...

  4. UltraISO安装centos7系统

    1. 使用最新版UltraISO将ISO镜像刻录到U盘一定要是最新版,试用版都可以,按下图操作: 2. U盘启动电脑进入安装界面正常情况下你应该会看到下面的这个界面: 选择第一项,然后按TAB键(在评 ...

  5. How to Change Default Web ADI Upload Parameters for FlexField Import / Validation

    How to Change Default Web ADI Upload Parameters for FlexField Import / Validation (文档 ID 553345.1) 转 ...

  6. 整理的Java List Set Map是否有序,元素是否允许重复

    整理的Java List Set Map是否有序,元素是否允许重复的说明,如下图:

  7. Weblogic 12c 负载均衡和session复制

    在上一篇,我们介绍了weblogic集群的部署和session的复制,如何将请求负载均衡到这个三个服务器上呢? 这里提供两种方式:(1)weblogic自带的proxy代理        (2) ng ...

  8. Android简易实战教程--第三十七话《NotifiCation》

    通知的使用,无疑是Android系统的亮点之一:就连IOS在5.0开始也引入了类似通知的技巧.可见它的实用性. 今天这个小案例,就学习一下通知的基本使用,API是使用最新的API,4.3以前创建通知的 ...

  9. defaultdict的威力

    >>> from collections import defaultdict >>> s='mmississippi' >>> d=defaul ...

  10. 【安卓开发】Layout Inflation不能这么用

    Layout inflation在Android上下文环境下转换XML文件成View结构对象的时候需要用到. LayoutInflater这个对象在Android的SDK中很常见,但是你绝对没想到竟然 ...