【设计模式】—— 访问者模式Visitor
前言:【模式总览】——————————by xingoo
模式意图
对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同。此时,就是访问者模式的典型应用了。
应用场景
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");
}
}
全部代码
package com.xingoo.test.design.visitor; import java.util.ArrayList;
import java.util.List; 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();
}
}
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");
}
}
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);
}
}
}
public class Client {
private static Context ctx = new Context();
public static void main(String[] args) {
ctx.add(new NodeA());
ctx.add(new NodeB());
ctx.visit(new VisitA());
ctx.visit(new VisitB());
}
}
运行结果
***visitA***
NodeA visited
***visitA***
NodeB visited
***visitB***
NodeA visited
***visitB***
NodeB visited
【设计模式】—— 访问者模式Visitor的更多相关文章
- 设计模式 -- 访问者模式(Visitor)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初识访问者模 ...
- C#设计模式——访问者模式(Visitor Pattern)
一.概述由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改.对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能.二.访问 ...
- 大话设计模式--访问者模式 Visitor -- C++实现实例
1. 访问者模式: 表示一个作用于某对象结构中的和元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式把数据结构和作用于结构上的操作之间的耦合脱开,使得操作集合可以 ...
- 深入浅出设计模式——访问者模式(Visitor Pattern)
模式动机 对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生 ...
- 设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)
设计模式 ( 二十 ) 访问者模式Visitor(对象行为型) 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象, ...
- 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...
- 访问者模式 Visitor 行为型 设计模式(二十七)
访问者模式 Visitor <侠客行>是当代作家金庸创作的长篇武侠小说,新版电视剧<侠客行>中,开篇有一段独白: “茫茫海外,传说有座侠客岛,岛上赏善罚恶二使,每隔十年 ...
- 二十四种设计模式:访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern) 介绍表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 示例有一个Message实体类,某些对象对 ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- JAVA 设计模式 访问者模式
用途 访问者模式 (Visitor) 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式是一种行为型模式. 用途
随机推荐
- odoo 订单打印 会出现字体. ........... 虚线问题
在表头加 红色部分 <?xml version="1.0" encoding="utf-8"?><openerp> <data&g ...
- Linux中一个网卡含有多个IP,将从IP升级为主IP的方法
今天在查看虚拟机的时候,发现某一网卡含有多个IP地址: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fas ...
- 算法篇(前序)——Java的集合
菜鸟拙见,望请纠正:附上JDK参考文档(中文文档和英文文档):链接:https://pan.baidu.com/s/14KDmCtQxeGCViq7e0zENjA 密码:e9xs 以及算法篇全文链接 ...
- ME_PROCESS_PO_CUST 实现采购订单行项目增强
用户希望创建采购订单时,输入行项目时,能根据采购订单类型,自动带出科目分类类别. 业务顾问看了一下配置,不能实现这个功能,所以用增强实现. 采购订单BADI增强:ME_PROCESS_PO_CUST. ...
- python 3.x 用户登录重设密码
import os import sys import getpass login_username = 'admin' login_password = ' u = 0 while u < 3 ...
- tf tensor 输出
在学习TensorFlow的过程中,我们需要知道某个tensor的值是什么,这个很重要,尤其是在debug的时候.也许你会说,这个很容易啊,直接print就可以了.其实不然,print只能打印输出sh ...
- mfc Radio Buttons
添加单选按钮 关联变量 调试宏TRACE BOOL类型 一.添加一组单选按钮 二.添加第二组单选按钮 三.关联变量 四.单选按钮运用 void CMY_Dialog::OnBnClickedButto ...
- GAN初步——本质上就是在做优化,对于生成器传给辨别器的生成图片,生成器希望辨别器打上标签 1,体现在loss上!
from:https://www.sohu.com/a/159976204_717210 GAN 从 2014 年诞生以来发展的是相当火热,比较著名的 GAN 的应用有 Pix2Pix.CycleGA ...
- ScreenToGif 代码分析
ScreenToGif项目由四个文件夹组成: Files 存放协议文件 GifRecorder 存放gif编码器代码 ScreenToGif 存放主代码 Other 存放Hooktest和Transl ...
- 利用JS实现一个简单的二级联动菜单
前几天在看js的相关内容,所以就简单写了一个二级联动菜单.分享一下. <!DOCTYPE html> <html lang="en"> <head&g ...