名  称 
Visitor(访问者模式)

意  图 
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

适  用

环  境 
u       一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。

u       需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Vi s i t o r 使得你可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用Vi s i t o r 模式让每个应用仅包含需要用到的操作。

u       定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。

结  构 
  

协  作

关  系

示例代码:

// package visitor; public abstract class Node { abstract void accept(Visitor v); } // package visitor; public class NodeA extends Node { @Override void accept(Visitor v) { v.vist(this); } public String operate() { return "operate A"; } } // package visitor; public class NodeB extends Node { @Override void accept(Visitor v) { v.vist(this); } public String operate() { return "operate B"; } } // package visitor; public interface Visitor { public void vist(NodeA na); public void vist(NodeB nb); } // package visitor; public class VisitorA implements Visitor { @Override public void vist(NodeA na) { System.out.println(na.operate()); } @Override public void vist(NodeB nb) { System.out.println(nb.operate()); } } // package visitor; public class VisitorB implements Visitor { @Override public void vist(NodeA na) { System.out.println(na.operate()); } @Override public void vist(NodeB nb) { System.out.println(nb.operate()); } } // package visitor; import java.util.Enumeration; import java.util.Vector; public class Structor { private Vector nodes; private Node node; public Structor() { nodes = new Vector(); } public void action(Visitor v) { for(Enumeration e = nodes.elements();e.hasMoreElements();) { node = (Node) e.nextElement(); node.accept(v); } } public void add(Node n) { nodes.add(n); } } // package visitor; public class Client { private static Structor s; private static Visitor v; public static void main(String[] args) { s = new Structor(); s.add(new NodeA()); s.add(new NodeB()); v = new VisitorA(); s.action(v); } }

Visitor(访问者模式)相关推荐

  1. [导入]C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式.zip(10.41 MB)...

    讲座内容: 本培训课程探讨GoF23之 Visitor 访问者模式的意图.动因.原理.应用场景与C#语言实现,以及该模式在.NET框架程序设计中的具体应用. 课程讲师: 李建忠 上海祝成信息科技有限公 ...

  2. Java 设计模式之 Visitor 访问者模式

    Visitor 访问者模式适用的场景是,存在某个容器,里面的组成部分不会发生变化,对这些组成部分的访问,不是由这个容器决定,而是交给访问者决定. 举个生活中的例子,比如稻草人,卖包,卖鞋子这些固定的消 ...

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

    目录 前言 1 定义 2 适用性 3 结构 3.1 结构图 3.2 参与者 4 Java实际应用举例--以ASM技术为例 4.1 被访问对象--ClassReader 4.2 Visitor--Cla ...

  4. 访问者模式 php,php设计模式 Visitor 访问者模式

    /** * 访问者模式 * * 表示一个作用于某对象结构中的各元素的操作,可以在不改变各元素的类的前提下定义作用于这些元素的新操作 * */ abstract class Visitor { abst ...

  5. 浅谈Visitor访问者模式

    一.前言 什么叫访问,如果大家学过数据结构,对于这点就很清晰了,遍历就是访问的一般形式,单独读取一个元素进行相应的处理也叫作访问,读取到想要查看的内容+对其进行处理就叫作访问,那么我们平常是怎么访问的 ...

  6. 设计模式之略见一斑(Visitor访问者模式)

    在开发中,我们可能会经常碰到客户提了一新的需求,那么在现有的类实现新的需求呢?通常的做法是添加新的方法.但是有时候我们只能看到接口,而根本无法看到其接口实现.这个时候我们就无法往接口里添加接的方法.但 ...

  7. java visitor_Java设计模式(三) Visitor(访问者)模式及多分派场景应用

    基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作可以借助新的visitor实现,降低了操作间的耦合性 访问者可以将数据结构和对数据的操作解耦,使得增加对数据结构的操作不需要 ...

  8. 设计模式之Visitor访问者模式

    1. 抽象类 1.1. 访问者 class Apple; class Pork; class Visitor { public:virtual ~Visitor() = default;virtual ...

  9. Visitor 访问者模式

    意图 表示一个作用于某对象结构的各个元素的操作,他可以在不改变各元素的前提下定义作用于这些元素的新的操作. public abstract class Shape { public abstract ...

  10. Visitor(访问者)模式在SAP CDS view测试框架中的灵活运用

    CDS view test double framework visitor pattern

最新文章

  1. 《Bigtable:a distributed storage system for struct data》笔记
  2. Python基础最常用且重要的模块总结----建议收藏
  3. JavaScript深入之变量对象
  4. EOS 智能合约源代码解读 (10)token合约“几种关键操作”
  5. 经常使用命令 echo、@、call、pause、rem
  6. 前端学习(663):逻辑中断逻辑与
  7. 【测试】身份证的前世今生
  8. sklearn 神经网络_机器学习100天-Day2404 循环神经网络RNN(预测时间序列)
  9. Laravel核心解读--Database(一)基础介绍
  10. WORD如何一键转PPT
  11. VMware下ubuntu全屏显示
  12. 超高薪的机器学习工程师和现在的前后端们有什么不同?
  13. 戴爾新電腦走上時尚路線
  14. 多种方式Map集合遍历
  15. 超详细的 Python 方法、函数总结
  16. 2020软件测试面试题汇总,看完BATJ面试官对你微微一笑!(内含答案)
  17. Struts2项目实战 微云盘(七):文件上传下载
  18. Mac安装卸载更新Homebrew
  19. Windows获取系统唯一标识UUID
  20. Excel常见高级公式

热门文章

  1. 关于《职场路上》专栏介绍
  2. Component属性
  3. 腾讯,竞争力 和 用户体验
  4. 哪有计算机课程,计算机基础课程的目标有以下哪几个( ? ?)
  5. js问题之判断是否是火狐、IE浏览器
  6. 指令系统 —— 指令格式
  7. DNS中继服务器研究
  8. 十大家用智能监控摄像头品牌排名
  9. RTX3080在Ubuntu 20.04复现yolact
  10. 版本号(version number)