学习地址: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读