学习地址: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)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 访问者模式-Visitor Pattern

    1.主要优点 访问者模式的主要优点如下: (1) 增加新的访问操作很方便.使用访问者模式,增加新的访问操作就意味着增加一个新的具体访问者类,实现简单,无须修改源代码,符合“开闭原则”. (2) 将有关 ...

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

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

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

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

随机推荐

  1. wpf控件设计时支持(1)

    原文:wpf控件设计时支持(1) 这部分内容几乎是大家忽略的内容,我想还是来介绍一下. 本篇源码下载 1.属性元数据 在vs IDE中,在asp.net,winfrom等开发环境下,右侧的Proper ...

  2. Linux下编译,要下载tar.xz,而不要下载zip,因为换行的编码不一样,对.h.cpp没有影响,但是对脚本有影响 good

    原因是 在win下编辑的时候,换行结尾是\n\r , 而在linux下 是\n,所以才会有 多出来的\r但是这个我是直接下载的官网文件解压的,没有动过啊. 破案了. linux下编译要下 .tar.x ...

  3. python_简单的DB统计

    import numpy as npimport pylab as pldates=['20170314','20170315','20170316','20170317','20170318','2 ...

  4. Mybatis 一对多 配置文件

    当一个Entity中包含的属性有对象和对象集合时,用mybatis映射时要在Entity中添加一个字段来唯一标识当前的Entity对象.否则查询的Entity集合中的对象会被覆盖掉. 如下一个POJO ...

  5. Asp.net MVC Razor输出字符串方法(js中嵌入razor)

    @{ Model p = new Model(); //输出名称和年龄 //1.第一种方式 @:姓名=@p.Name //2.第二中方式 <text>年龄=</text>p.A ...

  6. c#Code Contracts代码协定

    Code Contracts的命名空间:System.Diagnostics.Contracts 集合1. 安装Code Contracts for .NET插件Contracts.devlab9ts ...

  7. 投资人的能量往往大多远远不仅于此,他能站在不同的角度和高度看问题(要早点拿投资,要舍得让出股份)——最好不要让 Leader 一边做技术、一边做管理,人的能力是有限的,精力也是有限的

      摘要:在创业三年时间里作为联合创始人,虽然拿着大家均等的股份,我始终是没有什么话语权的,但是,这也给了我从旁观者的角度看清整个局面的机会.创业公司的成败绝大程度取决于技术大牛和公司 Leader, ...

  8. mingw 构建 mysql-connector-c-6.1.9记录(26种不同的编译错误,甚至做了一个windows系统返回错误码与System V错误码的一个对照表)

    http://www.cnblogs.com/oloroso/p/6867162.html

  9. 图像滤镜艺术---Photoshop实现Instagram之Mayfair滤镜效果

    原文:图像滤镜艺术---Photoshop实现Instagram之Mayfair滤镜效果 本文介绍一下如何使用Photoshop来实现Instagram中的Mayfair滤镜的效果. 以上就是这个滤镜 ...

  10. C#匿名方法返回值赋值给变量

    The problem here is that you've defined an anonymous method which returns a string but are trying to ...