一、什么是访问者模式

  Visitor模式也叫访问者模式,是行为模式之一 ,它分离对象的数据和行为,使用Visitor模式, 可以不修改已有类的情况下,增加新的操作。

二、访问者模式的应用示例

  比如有一个公园,有一到多个不同的组成部分;该公 园存在多个访问者:清洁工A负责打扫公园的A部分,清 洁工B负责打扫公园的B部分,公园的管理者负责检点各 项事务是否完成,上级领导可以视察公园等等。也就是 说,对于同一个公园,不同的访问者有不同的行为操 作,而且访问者的种类也可能需要根据时间的推移而变 化(行为的扩展性)。

  根据软件设计的开闭原则(对修改关闭,对扩展开 放),我们怎么样实现这种需求呢?

三、访问者模式的结构

四、访问者模式的角色和职责

  1) 访问者角色(Visitor): 为该对象结构中具体元素角色声明一个访问操作接口。该操作接 口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。 这样访问者就可以通过该元素角色的特定接口直接访问它。

   2) 具体访问者角色(Concrete Visitor): 实现每个由访问者角色(Visitor)声明的操作。

  3) 元素角色(Element): 定义一个Accept操作,它以一个访问者为参数。

  4) 具体元素角色(Concrete Element): 实现由元素角色提供的Accept操作。

  5) 对象结构角色(Object Structure): 这是使用访问者模式必备的角色。它要具备以下特征:能枚举 它的元素;可以提供一个高层的接口以允许该访问者访问它的元 素;可以是一个复合(组合模式)或是一个集合,如一个列表或一个无序 集合。

公园每一部分的抽象

 // 公园每一部分的抽象
public interface ParkElement {
//用来接纳访问者
public void accept(Visitor visitor);
}

公园

 //公园
public class Park implements ParkElement {
private String name;
private ParkA parkA;
private ParkB parkB; public Park() {
this.parkA = new ParkA();
this.parkB = new ParkB();
parkA.setName("A");
parkB.setName("B");
} public void accept(Visitor visitor) {
visitor.visit(this);
parkA.accept(visitor);
parkB.accept(visitor); } public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

公园的A部分

 // 公园的A部分
public class ParkA implements ParkElement {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public void accept(Visitor visitor) {
visitor.visit(this);
}
}

公园的B部分

 // 公园的B部分
public class ParkB implements ParkElement{
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public void accept(Visitor visitor) {
visitor.visit(this);
}
}

访问者

 // 访问者
public interface Visitor {
public void visit(Park park);
public void visit(ParkA parkA);
public void visit(ParkB parkB);
}

清洁工A,负责parkA的卫生情况

 // 清洁工A,负责parkA的卫生情况
public class VisitorA implements Visitor { public void visit(Park park) { } public void visit(ParkA parkA) {
System.out.println("清洁工A:完成公园" + parkA.getName()+ "的卫生");
} public void visit(ParkB parkB) { }
}

清洁工B,负责公园B部分的卫生

 // 清洁工B,负责公园B部分的卫生
public class VisitorB implements Visitor { public void visit(Park park) { } public void visit(ParkA parkA) { } public void visit(ParkB parkB) {
System.out.println("清洁工B:完成公园" + parkB.getName()+"的卫生");
}
}

管理员

 //管理员
public class VisitorManager implements Visitor { public void visit(Park park) {
System.out.println("管理员:负责" + park.getName() + "卫生检查");
} public void visit(ParkA parkA) {
System.out.println("管理员:负责公园"+ parkA.getName() +"部分卫生检查");
} public void visit(ParkB parkB) {
System.out.println("管理员:负责公园"+ parkB.getName() +"分部卫生检查");
}
}

测试

 public class MainClass {
public static void main(String[] args) {
Park park = new Park();
park.setName("越秀公园");
VisitorA visitorA = new VisitorA(); park.accept(visitorA); VisitorB visitorB = new VisitorB();
park.accept(visitorB); VisitorManager visitorManager = new VisitorManager();
park.accept(visitorManager);
}
}

24访问者模式Visitor的更多相关文章

  1. 设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)

    设计模式 ( 二十 ) 访问者模式Visitor(对象行为型) 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象, ...

  2. 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)

    原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...

  3. 访问者模式 Visitor 行为型 设计模式(二十七)

    访问者模式 Visitor    <侠客行>是当代作家金庸创作的长篇武侠小说,新版电视剧<侠客行>中,开篇有一段独白:  “茫茫海外,传说有座侠客岛,岛上赏善罚恶二使,每隔十年 ...

  4. 二十四种设计模式:访问者模式(Visitor Pattern)

    访问者模式(Visitor Pattern) 介绍表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 示例有一个Message实体类,某些对象对 ...

  5. 访问者模式(Visitor Pattern)——操作复杂对象结构

    模式概述 在软件开发中,可能会遇到操作复杂对象结构的场景,在该对象结构中存储了多个不同类型的对象信息,而且对同一对象结构中的元素的操作方式并不唯一,可能需要提供多种不同的处理方式,还有可能增加新的处理 ...

  6. C#设计模式——访问者模式(Visitor Pattern)

    一.概述由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改.对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能.二.访问 ...

  7. 十一个行为模式之访问者模式(Visitor Pattern)

    定义: 提供一个作用于某对象结构(通常是一个对象集合)的操作的接口,使得在添加新的操作或者在添加新的元素时,不需要修改原有系统,就可以对各个对象进行操作. 结构图: Visitor:抽象访问者类,对元 ...

  8. [设计模式] 23 访问者模式 visitor Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问 ...

  9. 学习笔记——访问者模式Visitor

    访问者模式,通过Visitor的注入,为Element扩展了方法实现.虽然避免了Element不用修改即可修改,但却破坏了类的封装性,同时,一旦变更就需要增加子类,在子类方法中调用基类方法,然后再使用 ...

随机推荐

  1. js计算本地时间

    获取时间戳: 方法一 var dateTime = new Date();//获取本地时间 var nowTime = dateTime.getTime();//获取本地毫秒,即当前时间 var en ...

  2. 前端可视化数据--echarts

    很幸运能够给大家分享我对echarts的见解,在一些大型互联网公司面试时都会问到会使用echarts么?  今天在做项目时有这个需求,有幸学习echarts. 二.echarts.js的优势与不足 优 ...

  3. Maven创建项目

    Maven创建项目 Maven翻译成中文是『专家.内行』.Maven是Apache组织中一个颇为成功的开源项目,Maven主要服务于基于Java平台的项目构建.依赖管理和项目信息管理的优秀工具 本文将 ...

  4. 实验楼-Git实战教程

    实验1-git介绍 1.版本控制系统: 1)集中式版本控制系统:版本库是集中存放在中央服务器的,工作时需要先从中央服务器取得最新的版本,然后工作完成后把自己的修订推送给中央服务器.这类系统都有一个单一 ...

  5. ajax冲刺03

    ---恢复内容开始--- 1.jq中ajax封装 简单的$.ajax方法使用示例:请关注 传参类型及数据 <!DOCTYPE html> <html lang="en&qu ...

  6. nginx配置实例

    user root root; worker_processes ; #error_log logs/error.log; #error_log logs/error.log notice; #err ...

  7. [Web 前端] qs.parse()、qs.stringify()使用方法

    cp from : https://blog.csdn.net/suwu150/article/details/78333452 qs是一个npm仓库所管理的包,可通过npm install qs命令 ...

  8. rvs产生服从指定分布的随机数 pdf概率密度函数 cdf累计分布函数 ppf 分位点函数

    统计工作中几个常用用法在python统计函数库scipy.stats的使用范例. 正态分布以正态分布的常见需求为例了解scipy.stats的基本使用方法. 1.生成服从指定分布的随机数 norm.r ...

  9. 【SQL 代码】SQL 语句记录(不定时更新)

    1.数值四舍五入,小数点后保留2位 round() 函数是四舍五入用,第一个参数是我们要被操作的数据,第二个参数是设置我们四舍五入之后小数点后显示几位. numeric 函数的2个参数,第一个表示数据 ...

  10. C#模拟客户端发送数据示例

      在给一些客户端做服务器端支持时,发现他们提交上来的数据大都不是http请求格式,因而使用Request.Form获取不到内容,今天用C#做下模拟,并演示下数据接收. 1.发送文本 1).客户端发送 ...