visitor

作者: ttyttytty | 来源:发表于2021-06-22 20:38 被阅读0次
    • 一种对象行为型模式
    • 根据“合成复用原则”,系统中要尽量使用关联关系来取代继承关系
    • 它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。
    • 通常在以下情况可以考虑使用访问者(Visitor)模式。
    • 对象结构相对稳定,但其操作算法经常变化的程序。
    • 对象结构中的对象需要提供多种不同且不相关的操作,而且要避免让这些操作的变化影响对象的结 构。

    public abstract class Visitor {
    //
    // public abstract void visit(File file);
    //
    // public abstract void visit(Directory dictionary);

    public abstract void visit(Entry entry);
    

    }
    public class ListVisitor extends Visitor {
    private String curDirName = "";
    //
    // @Override
    // public void visit(File file) {
    // System.out.println(curDirName + "/" + file);
    // }
    //
    // @Override
    // public void visit(Directory dictionary) {
    // System.out.println(curDirName + "/" + dictionary);
    // String saveDirName = curDirName;
    // curDirName = curDirName + "/" + dictionary.getName();
    // Iterator iterator = dictionary.iterator();
    // while (iterator.hasNext()) {
    // Entry next = (Entry) iterator.next();
    // next.accept(this);
    // }
    // curDirName = saveDirName;
    // }

    @Override
    public void visit(Entry entry) {
        if (entry instanceof File) {
            System.out.println(curDirName + "/" + entry);
        } else if (entry instanceof Directory) {
            System.out.println(curDirName + "/" + entry);
            String saveDirName = curDirName;
            curDirName = curDirName + "/" + entry.getName();
            Iterator iterator = entry.iterator();
            while (iterator.hasNext()) {
                Entry next = (Entry) iterator.next();
                next.accept(this);
            }
            curDirName = saveDirName;
        }
    }
    

    }
    public interface ElementOperation {
    void accept(Visitor visitor);
    }
    public abstract class Entry implements ElementOperation {
    // abstract 子类实现。不用维护一个父类的name和size字段
    public abstract String getName();

    // abstract  子类实现。不用维护一个父类的name和size字段
    public abstract int getSize();
    
    //该接口部分子类不实现,abstract,例如File子类
    public Entry add(Entry entry) {
        return null;
    }
    
    //该接口部分子类不实现,abstract,例如File子类
    public Iterator iterator() {
        return null;
    }
    
    @Override
    public void accept(Visitor visitor) {
        //交由子类 @Override实现
    }
    
    @Override
    public String toString() {
        return "Entry{" +
                "name='" + getName() + '\'' +
                ", size=" + 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 name;
    }
    
    @Override
    public int getSize() {
        return size;
    }
    
    @Override
    public void accept(Visitor visitor) {
        super.accept(visitor);//通用策略,可以父类同名实现部分通用功能,再实现子功能
        visitor.visit(this);
    }
    
    @Override
    public String toString() {
        return "File{" +
                "name='" + name + '\'' +
                ", size=" + size +
                '}';
    }
    

    }

    public class Directory extends Entry {
    private String name;
    private ArrayList dirs = new ArrayList();//不指定类型的List,放多个entry(可以是file or directory)

    public Directory(String name) {
        this.name = name;
    }
    
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
    
    @Override
    public String getName() {
        return name;
    }
    
    @Override
    public int getSize() {
        int size = 0;
        Iterator it = dirs.iterator();
        while (it.hasNext()) {
            Entry item = (Entry) it.next();
            size += item.getSize();
        }
        return size;
    }
    
    @Override
    public Entry add(Entry entry) {
        dirs.add(entry);
        return this;
    }
    
    @Override
    public Iterator iterator() {
        return dirs.iterator();
    }
    
    @Override
    public String toString() {
        return "Directory{" +
                "name='" + name + '\'' +
                ", size=" + getSize() +
                '}';
    }
    

    }

    相关文章

      网友评论

          本文标题:visitor

          本文链接:https://www.haomeiwen.com/subject/msposltx.html