【设计模式】行为型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读





原文地址:https://www.cnblogs.com/the-fool/p/11054144.html