博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图解设计模式-Visitor模式
阅读量:6837 次
发布时间:2019-06-26

本文共 3631 字,大约阅读时间需要 12 分钟。

Visitor模式即访问者模式
在数据结构中保存许多元素,我们会对这些元素进行处理,这时“处理”代码放在那里比较好?通常的做法是将它们放在表示数据结构中的类中。但是,如果“处理”有许多中那?这种情况下,没当增加一种处理时,我们就不得不去修改表示数据结构的类。
Visitor模式中将
数据结构与处理分离开。
 
角色:
Visitor访问者:负责对数据结构中的每个具体元素声明一个用于访问XXXX的visitor(XXXX)方法。visitor(XXXX)用于处理XXXX的方法,负责实现该方法的是ConcreteVisitor角色,本示例中由Visitor类扮演。
ConcreteVisitor具体的访问者:负责实现Visitor角色所定义的接口ApI。它要实现所有的visitor(XXXX)方法,即实现如何处理每个ConcreteElement角色。在本示例中,有ListVisitor类扮演。
Element元素:表示Visitor角色的访问对象。它声明了介绍访问者的accept方法,accept方法接受到的参数为Visitor角色,本示例中由Element类扮演。
ConcreteElement具体元素:负责实现Element角色所定义的接口API。
Constructure对象结构:负责处理Element角色的集合。ConcreteVisitor角色为每个Element角色都准备了处理方法。
 
代码:
public abstract class Visitor {    public abstract void visitor(File file);    public abstract void visitor(Directory directory);}
public interface Element {    public abstract void accept(Visitor visitor);}
public abstract class Entry implements Element {    public abstract String getName();    public abstract int getSize();    public Entry add(Entry entry) throws Exception {        throw new Exception("add");    }    public Iterator iterator() throws Exception {        throw new Exception("iterator");    }    @Override    public String toString() {        return getName() + "("+getSize()+")";    }}
public class File extends Entry {    private String name;    private int size;    public File(String name,int size) {        this.name = name;        this.size = size;    }    @Override    public String getName() {        return this.name;    }    @Override    public int getSize() {        return this.size;    }    @Override    public void accept(Visitor visitor) {        visitor.visitor(this);    }}
public class Directory extends Entry {    private String name;    private ArrayList
dir = new ArrayList<>(); public Directory(String name) { this.name = name; } @Override public String getName() { return this.name; } @Override public int getSize() { int size = 0; for(Entry entry:dir) { size +=entry.getSize(); } return size; } public Entry add(Entry entry) { dir.add(entry); return this; } public Iterator iterator() { return dir.iterator(); } @Override public void accept(Visitor visitor) { visitor.visitor(this); }}
public class ListVisitor extends Visitor {    private String currentDir = "";    @Override    public void visitor(File file) {        System.out.println(currentDir + "/" +file.getName());    }    @Override    public void visitor(Directory directory) {        System.out.println(currentDir + "/" +directory.getName());        String savedir = currentDir;        currentDir = currentDir + "/" +directory.getName();        Iterator iterator = directory.iterator();        while(iterator.hasNext()) {            Entry entry = (Entry) iterator.next();            entry.accept(this);        }        currentDir = savedir;    }}
public class Main {    public static void main(String[] args) {        try {            Directory rootDir = new Directory("root");            Directory binDir = new Directory("bin");            Directory tempDir = new Directory("temp");            Directory userDir = new Directory("user");            rootDir.add(binDir);            rootDir.add(tempDir);            rootDir.add(userDir);            binDir.add(new File("vi",1000));            binDir.add(new File("latex",2000));            rootDir.accept(new ListVisitor());        }catch (Exception ex){            ex.printStackTrace();        }    }}
执行结果:
/root
/root/bin
/root/bin/vi
/root/bin/latex
/root/temp
/root/us

转载于:https://www.cnblogs.com/use-D/p/9615954.html

你可能感兴趣的文章
NodeJS、NPM安装配置步骤(windows版本)
查看>>
mac常用的命令
查看>>
knn 分类
查看>>
【总结】Hadoop中的MultipleOutputs实践
查看>>
测试常见问题
查看>>
SHOP++ 中Hibernate 注解 用法
查看>>
jQuery EasyUI使用教程之创建基本的树网格
查看>>
Fluentd日志处理-插件使用和调试问题(四)
查看>>
实验四 交换机SPAN功能配置 (交换与路由技术)
查看>>
centos7源码安装php5.6并安装pthreads扩展
查看>>
网络基础~linux路由与网关、路由命令
查看>>
强大的联想4U机架式服务器ThinkSystem SR950
查看>>
美国防部:美国×××防御系统存在诸多安全问题
查看>>
阿里云搭建lamp平台
查看>>
Reverse Integer之Java实现
查看>>
Linux的SSH服务初学
查看>>
不同于FTP的另一款文件传输工具
查看>>
MYSQL 逻辑架构
查看>>
第11课--11_04_Linux网络配置之四 ifconfig及ip命令详解
查看>>
Linux命令之grep/sed/awk等行转列
查看>>