访问者设计模式是最难的设计模式.

Object Structure:公园

Element:是一个抽象,可以是一个接口或者是抽象类.是公园的每一个部分的抽象.

Concrete Element:实际的元素角色.公园的A部分或者是公园的B部分.accept()接待人.

Visitor:抽象的访问者.

Concrete Visitor:清洁工A或者是清洁工B.visit()访问.


对象角色结构Object Structure:Park

Element:ParkElement.公园的每一部分的抽象.

ConcreteElement:ParkA和ParkB.

访问者:Visitor

访问者的具体实现:清洁工AVisitor和清洁工BVisitorB.
Park是用来接收访问者的,它里面没有任何输出的,是没有任何方法的实现的.

输出是由访问者实现的,访问者是如何实现的就看它里面的visit()方法是如何实现的.


public void visit(Park park) {//除了是结合你的不同的重载方法以外,还可以获得park的数据.


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

public class Park implements ParkElement {private  ParkA parkA;private  ParkB parkB;private String name;//假设公园是有名字的.public Park() {super();// TODO Auto-generated constructor stubthis.parkA = new ParkA();this.parkB = new ParkB();parkA.setName("A");parkB.setName("B");}@Overridepublic void accept(Visitor visitor) { // TODO Auto-generated method stubvisitor.visit(this);//把Park传入进去
        parkA.accept(visitor);parkB.accept(visitor);}public String getName() {return name;}public void setName(String name) {this.name = name;}}

/** 公园的A部分*/
public class ParkA implements ParkElement {private String name;@Overridepublic void accept(Visitor visitor) {// TODO Auto-generated method stubvisitor.visit(this);//把ParkA传进去
    }public String getName() {return name;}public void setName(String name) {this.name = name;}}

/** 公园的B部分* */
public class ParkB implements ParkElement{private String name;@Overridepublic void accept(Visitor visitor) {// TODO Auto-generated method stubvisitor.visit(this);//把ParkB传进去
    }public String getName() {return name;}public void setName(String name) {this.name = name;}}

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

/** * 访问者*/
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 {@Overridepublic void visit(Park park) {// TODO Auto-generated method stub
}@Overridepublic void visit(ParkA parkA) {// TODO Auto-generated method stubSystem.out.println("清洁工A:完成公园"+parkA.getName()+"的卫生");}@Overridepublic void visit(ParkB parkB) {// TODO Auto-generated method stub
}}

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

public class VisitorManager implements Visitor{@Overridepublic void visit(Park park) {//除了是结合你的不同的重载方法以外,还可以获得park的数据.// TODO Auto-generated method stub//System.out.println("管理员:负责公园卫生检查");    System.out.println("管理员:负责"+park.getName()+"卫生检查");    }@Overridepublic void visit(ParkA parkA) {// TODO Auto-generated method stubSystem.out.println("管理员:负责公园"+parkA.getName()+"部分卫生检查");}@Overridepublic void visit(ParkB parkB) {// TODO Auto-generated method stubSystem.out.println("管理员:负责公园"+parkB.getName()+"部分卫生检查");}}

转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/6750329.html

第二十三讲:访问者模式相关推荐

  1. 开环直流电机的机械特性_第二十三讲 20直流PWM变换器-电动机系统及开环调速系统机械特性.ppt...

    第二十三讲 20直流PWM变换器-电动机系统及开环调速系统机械特性 谢谢! 本讲结束 * * 电力传动控制系统 上海开放大学 * 第二十三讲 直流PWM变换器-电动机系统及开环调速系统机械特性 * 不 ...

  2. 织梦仿站系列教程第二十三讲——列表页制作(二)

    织梦后台提示用户名不存在 查看数据库用户名被改为spider 织梦仿站系列教程第二十三讲--列表页制作(二) 这一讲,我们讲下列表页的分页代码,先找到如下代码: 865 1 href="ht ...

  3. 第二十三讲 解一阶微分方程组

    例题 {u1′=−u1+2u2u1′=u1−2u2\left\{\begin{matrix}{u_{1}}'=-u_{1}+2u_{2}\\ {u_{1}}'=u_{1}-2u_{2}\end{mat ...

  4. 第二十二讲:自尊与自我实现 第二十三讲:总结(完)

    (注:此为课程第二十二课,更新于2017年7月23日.) 今天我们会讲完自尊,然后下节课将是我们这个学期最后一次课.我会总结一下我们讲过的内容,我们讲过的和我们将要讲的内容. 先回顾一下我们讲过的,就 ...

  5. 第二十三讲 狄拉克函数(冲激函数)

    一,脉冲及建立模型 在一个时间区间上的作用等于,如果是恒定的,则 如图: 在小车上作用一个脉冲(一个力使小车左移或右移一段时间),假设时间从0到h,冲量是1(曲线下的面积是1)如图: 假设没有阻尼,弹 ...

  6. Java SE 第二十三讲----static关键字and final关键字

    1.static关键字 [在二十二讲视频中30分钟开始讲授] 2.static修饰属性:无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量:一个对象对该静态成员变量进行了修改,其他 ...

  7. halcon第二十三讲:标定助手标定测量

    1.生成标定板 文件ps格式,可通过ps软件打印出来, 以及标定板的描述文件descr格式 gen_caltab (7, 7, 0.0125, 0.5, 'caltab.descr', 'caltab ...

  8. 第二十三讲 狄拉克函数(冲激函数)(补充)

    四,例题: 如图,假设没有阻尼,弹簧常数,在的瞬间,输入一个冲量A,单位冲量为 建立数学模型: 初始条件:(初始位置),(初始速度) 第一步:两边拉式变换 左边: 代入初始条件:, 左边: 右边:(利 ...

  9. 第二十三讲 常用技术标准【2021年软考-高级信息系统项目管理师】

    27. 常用技术标准 27.1 标准化分类代码 我国标准的级别:标准可以分为国际标准.国家标准.行业标准.地方标准及企业标准等.国际标准主要是指由国际标准化组织 (ISO)制定和批准的标准. 国家标准 ...

最新文章

  1. 分割 标注数据_7种常用的数据标注工具
  2. Spring源码解析-三级缓存与循环依赖,nginx架构图
  3. 3D数学基础:图形与游戏开发---随笔四
  4. boost::multiprecision模块实现打印出所有的阶乘 这将适合一个 128 位整数相关的测试程序
  5. JS 获取浏览器、显示器 窗体等宽度和高度
  6. mysql performance tuning_MySQL Performance tuning
  7. android- Auto Monitor Logcat
  8. Mac安装brew及报错处理办法
  9. an 转换器_400V耐压场效应管替代IRF730B型号参数,使用在DC-DC电源转换器。_场效应管吧...
  10. django实现上传文件并保存
  11. Linux2.6信号管理
  12. dllimport 找不到指定的模块_Python语法基础(15)模块与包
  13. 计算机-库win10,Win10游戏运行库合集32/64位 官方最新版
  14. 【datawhale-gitmodel】以波士顿房价数据进行数据分析和数据可视化
  15. 雷电云手机无限雷币版v1.60
  16. 第十三章:(1)CompletableFuture异步回调
  17. 2020年Android GMS 认证 boot logo 最新要求
  18. thinkadmin按配置上传文件至本地,七牛云或阿里oss
  19. 程序猿真的觉得写代码比女朋友重要吗?
  20. ×××网站与***的秘密

热门文章

  1. 英伟达RTX 3080值不值得抢?在TensorFlow上训练了卷积网络
  2. C++中string、char[]、char*之间的转换
  3. MLSQL解决了什么问题
  4. 图像处理(二十四)Gradient Domain High Dynamic Range Compression学习笔记
  5. rbf核函数_高斯过程回归础(使用GPy和模拟函数数据集)
  6. ESXI忘记密码怎么办
  7. 语言 双线性内插_数位语音信号处理概论 Lesson6 语言模型
  8. python脚本在linux上运行的两种方式_python脚本当作Linux中的服务启动实现方法
  9. Objective-C 日记④ 集合家族
  10. 清理神器CleanMyMac X 空间透镜——可视化您的磁盘空间