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. Java8的重要新特性

    一.Lambda表达式 java8中Lambda表达式的书写方式: (参数) -> 表达式 (参数) -> 单行语句 (参数) -> { 语句 } 1.Lambda遍历List和Ma ...

  2. postman 模拟请求中添加 header,post请求中传json参数

    1. GET 请求 2.Post 请求 (请求参数为Json,header中带有参数) 问题延伸 GET请求不能够 添加 Body 吗?[答案]

  3. python2.7入门---操作mysql数据库增删改查

    Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口.Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: G ...

  4. three.js 3D 动画场景

    Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质等各种对象.使用它它能让 WebGL 变得更加简单. 下面用Three.js渲染一个物体360 ...

  5. 正确在遍历中删除List元素

    最近在写代码的时候遇到了遍历时删除List元素的问题,在此写一篇博客记录一下. 一般而言,遍历List元素有以下三种方式: 使用普通for循环遍历 使用增强型for循环遍历 使用iterator遍历 ...

  6. 62. Unique Paths(中等,我自己解出的第一道 DP 题^^)

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  7. Python中strip()、lstrip()、rstrip()用法详解

    Python中有三个去除头尾字符.空白符的函数,它们依次为: strip: 用来去除头尾字符.空白符(包括\n.\r.\t.' ',即:换行.回车.制表符.空格)lstrip:用来去除开头字符.空白符 ...

  8. VSCode 插件推荐

    vscode-icons  用于项目中文件类型显示对应的图标,提高文件定位的效率. vscode-tslint  用于 TS 的规范检测 Path Intellisense  用于提示导入文件时候的路 ...

  9. JavaScript 知识图谱

  10. C++编译连接过程中关于符号表的报错分析

    是这样的,在学习郑莉老师的多文件结构和编译预处理命令章节时候,看到书里有这么一张图描述如下:#include指令作用是将指定的文件嵌入到当前源文件中#include指令所在的位置. 然后我就想5_10 ...