一、什么是访问者模式

  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. sklearn CART决策树分类

    sklearn CART决策树分类 决策树是一种常用的机器学习方法,可以用于分类和回归.同时,决策树的训练结果非常容易理解,而且对于数据预处理的要求也不是很高. 理论部分 比较经典的决策树是ID3.C ...

  2. Vmware下mint os的安装

    在vmware 11中,mint倒是很好安装.直接读取iso文件,会自动进入一个类似WindowsPE的安装系统,直接双击开始安装就好,比较傻瓜化. 但是安装好了,字体太小,看着很不舒服,于是就倒腾V ...

  3. MUI学习03-滚动图(幻灯片)及菜单项(九宫格)

    <!--标准mui.css-->引入CSS:<link rel="stylesheet" href="../css/mui.min.css"& ...

  4. delphi ListView 设置固定列宽

    object Form1: TForm1 Left = Top = Caption = 'Form1' ClientHeight = ClientWidth = Color = clBtnFace F ...

  5. 我所知道的JS调试

    前言 任何一门语言都有对应的调试方法,也有对应的调试工具,JavaScript当然也不例外.最常用的莫过于浏览器这个调试工具了.而今天我们要讲的对于这个基础调试就不细说,我会将目前所有调试javasc ...

  6. Could not load file or assembly 'System.Web.Mvc, Version=5.2.3.0...

    一.在Mvc 发布时出现如下错误: Could not load file or assembly 'System.Web.Mvc, Version=5.2.3.0... 出现错误的原因是 Mvc版本 ...

  7. golang 特殊知识点

    golang 代码不需要分号; 但是又会自己在底层增加;号 ,所以 golang的{左花括号必须在代码的最后一行,而不能在新的一行; golang 代码组织里需要注意 vendor 和 interna ...

  8. 罗技Setpoint控制酷狗等第三方播放器

    手里有个淘过来的二手戴尔蓝牙键盘,虽然是戴尔的,但是确实罗技代工的,因此可以使用罗技的Setpoint,用这个软件后可以集中管理罗技的键盘鼠标进行一些个性化设置,如下图所示.不过郁闷的是如果不装Set ...

  9. android: 在APP中显示高德地图SDK

    一.搭建环境 参考资料:http://lbs.amap.com/api/android-sdk/guide/create-project/android-studio-create-project  ...

  10. VuePress

    VuePress 这篇文章主要是记录自己在使用VuePress过程中所遇到的问题以及如何一步一步的解决问题. 安装vuepress前,请确保你的 Node.js 版本 >= 8 全局安装 # 安 ...