【设计模式】—— 访问者模式Visitor

对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同。此时,就是访问者模式的典型应用了。

  应用场景

  1 不同的子类,依赖于不同的其他对象

  2 需要对一组对象,进行许多不相关的操作,又不想在类中是现在这些方法

  3 定义的类很少改变,但是执行的操作却经常发生改变。

回到顶部

  模式结构

  Context 环境角色

复制代码
class Context{List<Node> list = new ArrayList();public void add(Node node) { list.add(node); } public void visit(Visitor visitor) { for(Node node : list){ node.accept(visitor); } } }
复制代码

  Visitor 访问者角色

复制代码
interface Visitor{public void visit(NodeA nodeA);public void visit(NodeB nodeB); } class VisitA implements Visitor{ public void visit(NodeA nodeA){ System.out.println("***visitA***"); nodeA.action(); } public void visit(NodeB nodeB){ System.out.println("***visitA***"); nodeB.action(); } } class VisitB implements Visitor{ public void visit(NodeA nodeA){ System.out.println("***visitB***"); nodeA.action(); } public void visit(NodeB nodeB){ System.out.println("***visitB***"); nodeB.action(); } }
复制代码

  Node 被访问角色

复制代码
interface Node{public void accept(Visitor visitor);
}
class NodeA implements Node{ public void accept(Visitor visitor) { visitor.visit(this); } public void action(){ System.out.println("NodeA visited"); } } class NodeB implements Node{ public void accept(Visitor visitor) { visitor.visit(this); } public void action(){ System.out.println("NodeB visited"); } }
复制代码

  全部代码

复制代码
 1 package com.xingoo.test.design.visitor;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;  5  6 interface Visitor{  7 public void visit(NodeA nodeA);  8 public void visit(NodeB nodeB);  9 } 10 class VisitA implements Visitor{ 11 public void visit(NodeA nodeA){ 12 System.out.println("***visitA***"); 13  nodeA.action(); 14  } 15 public void visit(NodeB nodeB){ 16 System.out.println("***visitA***"); 17  nodeB.action(); 18  } 19 } 20 class VisitB implements Visitor{ 21 public void visit(NodeA nodeA){ 22 System.out.println("***visitB***"); 23  nodeA.action(); 24  } 25 public void visit(NodeB nodeB){ 26 System.out.println("***visitB***"); 27  nodeB.action(); 28  } 29 } 30 interface Node{ 31 public void accept(Visitor visitor); 32 } 33 class NodeA implements Node{ 34 public void accept(Visitor visitor) { 35 visitor.visit(this); 36  } 37 public void action(){ 38 System.out.println("NodeA visited"); 39  } 40 } 41 class NodeB implements Node{ 42 public void accept(Visitor visitor) { 43 visitor.visit(this); 44  } 45 public void action(){ 46 System.out.println("NodeB visited"); 47  } 48 } 49 class Context{ 50 List<Node> list = new ArrayList(); 51 public void add(Node node) { 52  list.add(node); 53  } 54 public void visit(Visitor visitor) { 55 for(Node node : list){ 56  node.accept(visitor); 57  } 58  } 59 } 60 public class Client { 61 private static Context ctx = new Context(); 62 public static void main(String[] args) { 63 ctx.add(new NodeA()); 64 ctx.add(new NodeB()); 65 ctx.visit(new VisitA()); 66 ctx.visit(new VisitB()); 67  } 68 }
复制代码

转载于:https://www.cnblogs.com/lzcaima/p/5116966.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ruby宝石区块链最新消息_Ruby宝石| Ruby工具

ruby宝石区块链最新消息Ruby宝石 (Ruby Gems) Every language has its package manager which helps it by providing libraries and a standard format to distribute Ruby program. It is a type of tool which is developed to easily facilitate the installation of Gems.…

最小生成树prim (c++ 已大改)

2019独角兽企业重金招聘Python工程师标准>>> #include <iostream> #include <vector> #include <set> #include <map> #include <initializer_list> #include <memory> template<typename T> class Graph{private:std::m…

前端接入HTTP协议浅析

【摘要】&#xff1a;本文整理并简要分析了HTTP协议的交互过程和内容格式&#xff0c;包括HTTP请求、HTTP应答的头域和实体内容&#xff0c;HTTP 1.0与HTTP 1.1的差异&#xff0c;并举例说明了Chunked编码的工作过程原理。1、HTTP协议简介浏览器和Web服务器之间一问一答的交互过…

互联网传真 传真指令_传真的完整形式是什么?

互联网传真 传真指令传真&#xff1a;传真 (FAX: Facsimile) FAX is an abbreviation of "Facsimile". 传真是“传真”的缩写 。 It is commonly written and spoken as FAX. It is a telephonic transmission of a scanned copy of text and images printed on a p…

C#使用七牛云存储上传下载文件、自定义回调

项目需要将音视频文件上传服务器&#xff0c;考虑并发要求高&#xff0c;通过七牛来实现。 做了一个简易的压力测试&#xff0c;同时上传多个文件&#xff0c;七牛自己应该有队列处理并发请求&#xff0c;我无论同时提交多少个文件&#xff0c;七牛是批量一个个排队处理了。 一…

Linux下DRBD配置

一、什么是DRBD1、简介 Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。数据镜像&#xff1a;实时、透明、同步&#xff08;所有服务器都成功后返回&#xff09;、异步&#xff08;本地服务器成功后返回…

vue3实现本地开发使用的px转换成vw,px转换成rem方法整理

前言&#xff1a; 项目中如果想本地开发使用px&#xff0c;但是界面上线以后界面是自适应的效果,可以有多种方式来实现效果。 一、px转成vw 1、安装&#xff0c;安装成功后&#xff0c;node_modules 会新增这两个插件包 npm i postcss-px-to-viewport-8-plugin 2、新增 post…

airplay2协议是什么_什么是AirPlay?

airplay2协议是什么AirPlay (AirPlay) AirPlay is released by Apple in the year 2004. It allows the easy exchange of audios without the use of any wired technique between the two devices. It was previously termed as AirTunes and later got its name changed to …

微信支付开发(5) 订单查询

本文介绍微信支付中订单查询功能的实现。 作者&#xff1a;方倍工作室 地址&#xff1a;http://www.cnblogs.com/txw1958/p/wxpay-order-query.html 一、订单查询 因为某一方技术的原因&#xff0c;可能导致商户在预期时间内都收不到最终支付通知&#xff0c;此时商户可以通过该…

python饼形图_Python | 饼形图

python饼形图A pie plot or a pie chart is a circular statistical graphic technique, in which a circle is divided into slices with respect to numerical proportion. In a pie chart, the arc length, central angle, and area of each slice, is proportional to the …

appweb ejs_EJS部分

appweb ejsHi! Welcome. Today, we are going to look at EJS partials. EJS Partials help us avoid repetition of the same code on several web pages. 嗨&#xff01; 欢迎。 今天&#xff0c;我们将看EJS局​​部函数 。 EJS Partials帮助我们避免在多个网页上重复相同的…

同事反馈环:如何实现持续改进的文化

“魔镜魔镜告诉我&#xff0c;谁才是最美丽的人&#xff1f;”&#xff0c;邪恶的皇后如此问道。似乎在精益和敏捷企业中也会有很多与《白雪公主》中类似的问题&#xff0c;如果我们没有一面可以看到我们正在做什么的镜子&#xff0c;我们就很难搞清楚我们有多么美丽&#xff0…

经典功率谱估计及Matlab仿真

原文出自&#xff1a;http://www.cnblogs.com/jacklu/p/5140913.html 功率谱估计在分析平稳各态遍历随机信号频率成分领域被广泛使用&#xff0c;并且已被成功应用到雷达信号处理、故障诊断等实际工程中。本文给出了经典功率谱估计的几类方法&#xff0c;并通过Matlab的实验仿真…

极验验证码流程-3.图片加密处理 图片移位

终于把图片加密给搞定了&#xff0c;原理是他把图分成了52个部分&#xff0c;然后通过移动来形成新的图片 主要的位置关系看代码 顺便吐槽下ruby,小众语言就是这么不方便&#xff0c;很多库都没有&#xff0c;百度了半天 最后换成了java来写 图片保存到本地的就不详细说了 主要…

html-iframe_HTML iframe

html-iframeiframe (Iframes) In HTML, iframes are used to display a webpage inside another webpage. 在HTML中&#xff0c; iframe用于在另一个网页内显示一个网页。 Syntax: 句法&#xff1a; <iframe src"URL"></iframe>The <iframe> tag…

集合操作(三)Set

2019独角兽企业重金招聘Python工程师标准>>> Set集合 HashSet 哈希表保证元素的唯一性依赖于两个方法一个是hashCode方法一个是equals方法 如果两个对象的hashCode值相同,并且调用该对象的equals方法返回的是true的时候,那么就说明两个对象是相同的 结论&#xff1a…

第6周 搜索与排序

1 查找里程 给你这样一张里程表&#xff0c;如何写一个程序&#xff0c;输入两地的地名&#xff0c;能输出期间的里程&#xff1f; #include <stdio.h> #include <string.h> #define C_LEN 30typedef struct city {char name1[C_LEN];char name2[C_LEN];int distan…

(转) Twisted :第十九部分 改变之前的想法

2019独角兽企业重金招聘Python工程师标准>>> 简介 Twisted是一个正在进展的项目,它的开发者会定期添加新的特性并且扩展旧的特性. 随着Twisted 10.1.0发布,开发者向 Deferred 类添加了一个新的特性—— cancellation ——这正是我们今天要研究的. 异步编程将请求和响…

Mac 获取 Brew

2019独角兽企业重金招聘Python工程师标准>>> 终端输入 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 转载于:https://my.oschina.net/fdstudio/blog/610680

express 项目生成器_用于项目的Express模板生成器(2)| 应用程序结构研究

express 项目生成器Hello! In express template generator for your projects (1), we looked at express generator and how we can start an express application with stressing to build a brand new structure of all required files. 你好&#xff01; 在针对您的项目的E…