【设计模式】行为型09访问者模式(Visitor Pattern)
学习地址: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读
【设计模式】行为型09访问者模式(Visitor Pattern)的更多相关文章
- 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...
- 二十四种设计模式:访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern) 介绍表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 示例有一个Message实体类,某些对象对 ...
- 访问者模式(Visitor Pattern)——操作复杂对象结构
模式概述 在软件开发中,可能会遇到操作复杂对象结构的场景,在该对象结构中存储了多个不同类型的对象信息,而且对同一对象结构中的元素的操作方式并不唯一,可能需要提供多种不同的处理方式,还有可能增加新的处理 ...
- [设计模式] 23 访问者模式 visitor Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问 ...
- C#设计模式——访问者模式(Visitor Pattern)
一.概述由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改.对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能.二.访问 ...
- 十一个行为模式之访问者模式(Visitor Pattern)
定义: 提供一个作用于某对象结构(通常是一个对象集合)的操作的接口,使得在添加新的操作或者在添加新的元素时,不需要修改原有系统,就可以对各个对象进行操作. 结构图: Visitor:抽象访问者类,对元 ...
- 访问者模式-Visitor Pattern
1.主要优点 访问者模式的主要优点如下: (1) 增加新的访问操作很方便.使用访问者模式,增加新的访问操作就意味着增加一个新的具体访问者类,实现简单,无须修改源代码,符合“开闭原则”. (2) 将有关 ...
- 设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)
设计模式 ( 二十 ) 访问者模式Visitor(对象行为型) 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象, ...
- 访问者模式 Visitor 行为型 设计模式(二十七)
访问者模式 Visitor <侠客行>是当代作家金庸创作的长篇武侠小说,新版电视剧<侠客行>中,开篇有一段独白: “茫茫海外,传说有座侠客岛,岛上赏善罚恶二使,每隔十年 ...
随机推荐
- UVA 548(二进制重建和遍历)
J - Tree Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Ap ...
- C#中HttpWebRequest与HttpWebResponse的使用方法
关键字:C# HttpWebRequest HttpWebResponse HTTP GET POST 请求 这个类是专门为HTTP的GET和POST请求写的,解决了编码,证书,自动带Cookie等问 ...
- WPF中取得预定义颜色
原文:WPF中取得预定义颜色 使用XAML代码取得.net预定义颜色:<Page xmlns="http://schemas.microsoft.com/winfx/2006/x ...
- WPF 3D模型的一个扩展方法
原文:WPF 3D模型的一个扩展方法 在WPF 3D中,我们常常需要改变一个ModelVisual3D对象的颜色. 先说说ModelVisual3D,本质上3D模型都是由一个个的三角形构成的,并且经过 ...
- 非参贝叶斯(Bayesian Non-parameter)初步
0. motivations 如何确定 GMM 模型的 k,既观察到的样本由多少个高斯分布生成.由此在数据属于高维空间中时,根本就无法 visualize,更加难以建立直观,从而很难确定 k,高斯分布 ...
- 构建自己的PHP框架(路由)
完整项目地址:https://github.com/Evai/Aier 上一篇中我们已经建立了一个空的 Composer 项目,本篇将讲述如何构建路由. 下面我们就开始自己来构建路由,先去 GitHu ...
- NPM切换源
可以试试切换下你的NPM源.看是否能得到解决.国内的NPM有CNPM和淘宝的NPM源比较稳定.npm源切换和工具可参照站内贴 nrm工具的使用或者是直接用命令切换 npm config set r ...
- SSM导出报表为csv文件
报表导出思路为,在后台用iDataReader将查询得到的数据写进文件并压缩,向前端返回文件位置的链接,在前端执行下载操作. web端: 1. ajax请求url,将返回的路径json字符串解析并执行 ...
- Easyui Tab刷新
Easyui Tab刷新: function refreshTab(title){ var tab = $('#id').tab('getTab',title); $('#id').tab('upda ...
- Emgu-WPF 激光雷达研究-移动物体检测
原文:Emgu-WPF 激光雷达研究-移动物体检测 接上篇: https://blog.csdn.net/u013224722/article/details/80738619 先pose出效果图,下 ...