zoukankan      html  css  js  c++  java
  • 【设计模式】行为型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读





  • 相关阅读:
    Hbuilder连接第3方模拟器(夜神)
    localStorage H5本地存储
    各种经典教程的收集分享
    laravel学习教程整理
    js-打地鼠游戏开发
    我的文件备份
    jQuery Ajax 简单的实现跨域请求
    HTML如何编写为桌面程序
    js调用打印机
    js base64加密解密
  • 原文地址:https://www.cnblogs.com/the-fool/p/11054144.html
Copyright © 2011-2022 走看看