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. Unique-paths (动态规划)

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

  2. Oracle的dual

    1.dual 确实是一张表.是一张只有一个字段,一行记录的表. 2.习惯上,我们称之为'伪表'.因为他不存储主题数据.3.他的存在,是为了操作上的方便.因为select 都是要有特定对象的.但如果我们 ...

  3. 学习笔记:Zookeeper选举机制

    1.Zookeeper选举机制 Zookeeper虽然在配置文件中并没有指定master和slave 但是,zookeeper工作时,是有一个节点为leader,其他则为follower Leader ...

  4. springMVC源码分析--HandlerMethodArgumentResolver参数解析器(一)

    HandlerMethodArgumentResolver是用来为处理器解析参数的,主要用在HandlerMethod中,每个Resolver对应一种类型的参数,其实现类特别的多. HandlerMe ...

  5. 《An Industrial-Strength Audio Search Algorithm》译文

    随着微信摇一摇逐渐被大众所广泛使用,听歌识曲功能也开始被关注.目前来看,像音乐雷达和微信摇一摇都采用了经典的shazam算法,为了使大家对shazam算法更加了解,我将其经典论文进行了翻译,希望对大家 ...

  6. Redis之(二)数据类型及存储结构

    Redis支持五中数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及zset(sortedset:有序集合). Redis定义了丰富的原语命令,可以直接与Redis ...

  7. CentOS7下安装GitLab

    三步在CentOS7系统下,完成GitLab的安装. 1.安装和配置必须的依赖 sudo yum install curl policycoreutils openssh-server openssh ...

  8. 如何使用Live CD来修复Grub / Grub2

    Introduction 一般我会在计算机上装两个或者多个系统,例如,我在计算机上安装了Ubuntu.Windows 7.Windows 8.1.有一天我的Win8.1不能正常使用了,我想重新安装Wi ...

  9. Swift类型推测在可选调用中的小提示

    我们知道Swift中协议里也有对应于Objc中的可选方法或计算属性,当然协议必须以@objc伪指令修饰否则不可以哦. 如下示例: @objc protocol Transaction{ fun com ...

  10. named let 递归和闭包的利器

    named let和递归,闭包联系十分密切.而且还是提高性能的重要手段.先来看一个make-list函数的模拟,最原始的写法大概是: (define (imake-list n member) ( n ...