学习地址:https://blog.csdn.net/u012124438/article/details/70537203(参考了很多博客,只有这个讲明白了核心点)

访问者模式(Visitor  Pattern)

定义:将数据操作与数据结构分离的设计模式

实现方式访问者是一个接口,它拥有一个 visit 方法,这个方法对访问到的对象结构中不同类型的元素做出不同的处理。在对象结构的一次被访问过程中,我们遍历整个对象结构,对每一个元素都实施 accept 方法,在每一个元素的 accept 方法中会调用访问者的 visit 方法,从而使访问者得以处理对象结构的每一个元素,我们可以针对对象结构设计不同的访问者类来完成不同的操作,达到区别对待的效果。

类图:交给未来

代码:这里他博客中的demo有点复杂,我自己写了一个系统权限的Demo,略微有些跑偏,但是看完文案之后应该比较容易抓住核心点,代码如下:

1、访问者接口,所有不同类型的访问者都实现本接口:

package com.pat.visitor;
/**
* 访问者接口
* @author ZX
*
*/
public interface Visitor {
void visit(Systems sys); }

2、访问者实现类:

package com.pat.visitor;
/**
* 访问者实现类-系统管理员
* @author ZX
*/
public class AdminVisitor implements Visitor{ @Override
public void visit(Systems sys) {
sys.login();
sys.rr();
sys.ww();
sys.xx(); } }
package com.pat.visitor;
/**
* 访问者实现类-普通用户
* @author Administrator
*
*/
public class UsualVisitor implements Visitor{ @Override
public void visit(Systems sys) {
sys.login();
sys.rr(); } }

3、被访问者-系统类,持有accept方法

package com.pat.visitor;
/**
* 被访问者
* @author ZX
*
*/
public class Systems {
private String sysType; public void accept(Visitor visitor) {
visitor.visit(this);
}
public void login() {
System.out.println(sysType+"登录");
}
public void rr() {
System.out.println(sysType+"读");
}
public void ww() {
System.out.println(sysType+"写");
}
public void xx() {
System.out.println(sysType+"执行");
} public Systems(String sysType){
this.sysType=sysType;
}
}


4、系统中心,特定的对象数据结构

package com.pat.visitor;
/**
* 系统中心
* @author ZX
*
*/ import java.util.ArrayList;
import java.util.List; public class SystemCenter {
List<Systems> sysCenter = new ArrayList<>(); public void add(Systems sys) {
sysCenter.add(sys);
} public void show(Visitor visitor) {
for(Systems s:sysCenter) {
s.accept(visitor);
}
} }

5、测试类

package com.pat.visitor;

public class Test {
public static void main(String[] args) {
SystemCenter sc = new SystemCenter(); Systems s1= new Systems("windows7");
Systems s2= new Systems("ubuntu14");
Systems s3= new Systems("centOS7");
Systems s4= new Systems("redHat");
Systems s5= new Systems("windows10"); sc.add(s1);
sc.add(s2);
sc.add(s3);
sc.add(s4);
sc.add(s5); Visitor admin= new AdminVisitor();
Visitor usual= new UsualVisitor();
//管理员用户访问所有系统
sc.show(admin);
//普通用户访问所有系统
sc.show(usual);
}
}

6、结果:

管理员访问结果:

windows7登录
windows7读
windows7写
windows7执行
ubuntu14登录
ubuntu14读
ubuntu14写
ubuntu14执行
centOS7登录
centOS7读
centOS7写
centOS7执行
redHat登录
redHat读
redHat写
redHat执行
windows10登录
windows10读
windows10写
windows10执行

普通用户访问结果:

windows7登录
windows7读
ubuntu14登录
ubuntu14读
centOS7登录
centOS7读
redHat登录
redHat读
windows10登录
windows10读

最新文章

  1. Myeclipse中web project各种常见错误及解决方法(持续更新)
  2. Objective C 快速入门学习四
  3. Server.MapPath查询路径那几件事
  4. Android Service与Activity之间通信
  5. eclipse debug source not fount
  6. 法线贴图——Normal Mapping
  7. php监听客户端连接状态
  8. Linux命令——监视相关
  9. Delphi 动态改变Rzsplitter的Orientation(方向)属性
  10. C# 制作 仪表
  11. UltraISO PE(软碟通) V9.5.5.2960 官方中文版
  12. SQL Server 批量插入
  13. Cucumber启动类配置
  14. 【原创】大叔经验分享(5)oozie提交spark任务如何添加依赖
  15. 安装haproxy和haproxy命令
  16. Python高级特性(切片,迭代,列表生成式,生成器,迭代器)
  17. ASP: Response 对象 错误 &#39;ASP 0251 : 80004005&#39; 解决办法
  18. day3-PyCharm 断点 调试模式
  19. vue-8-组件
  20. 小技巧——病毒分析中关闭ASLR

热门文章

  1. 工作流管理平台Airflow
  2. java中的switch结构
  3. 信号、系统与滤波器设计(matlab)
  4. 关于VS2015中的code snippet无法使用的问题
  5. 脚本 启动/停止 jar包服务
  6. 【iOS发展-49】的插件-插件该文档的凝视VVDocumenter安装与使用
  7. jquery.cookie.js用法详解
  8. 如何获取app配置文件内容
  9. UWP中String类型如何转换为Windows.UI.Color
  10. Win8 Metro(C#)数字图像处理--2.44图像油画效果算法