访问者模式

《java与模式》中是这样描述访问者模式作用的:

访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。

下图简单的描述了访问者模式的结构:


image

类图及代码实现

未进行抽象封装的简单实现

image
/*
 * 图书馆(被访问者)
 */
public class Library {
    
    /*
     * 访问权限,调用该方法时,访问者才能访问自己
     */
    public void accept(Visitor v) {
        v.visit(this);
    }
    /*
     *展示自己
     */
    public void display() {
        System.out.print("访问成功!");
    }

}

/*
 * 访问者
 */
public class Visitor {
    
    /*
     * 调用用此方法可以进行访问
     */
    public void visit(Library l) {
        l.display();
    }
}
/*
 * 客户端
 */
public class Client {

    public static void main(String[] args) {
        //创建访问者对象
        Visitor visitor = new Visitor();
        //创建被访问者对象
        Library library = new Library();
        
        //被访问者允许访问者访问自己(主动)
        library.accept(visitor);
    }

}

抽象封装

image
/*
 * 被访问者具体类 Article
 */
class Article implements Library{

    @Override
    public void accept(Visitor vi) {
        vi.visit(this);
    }

    @Override
    public void display() {
        /*
         * do some things
         */
        System.out.println("访问成功!");
    }
    
}

/*
 * 访问者类的接口
 */
public interface Visitor {
    void visit(Library li);
}
class ConcreteVisitor implements Visitor{

    @Override
    public void visit(Library li) {
        li.display();
    }
    
}

/*
 * 访问者进行访问的代理,将访问者所有想访问的被访问者对象聚集到这里。
 */
public class Maneger {
    //保存所有请求访问者对象的集合
    private List<Library> list = new ArrayList<Library>();
    
    //添加被访问者对象
    public void add(Library l) {
        list.add(l);
    }
    
    //执行访问操作
    public void action(Visitor v) {
        for(Library i: list) {
            i.accept(v);
        }
    }
}
/*
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        //创建一个访问者对象
        Visitor v = new ConcreteVisitor();
        //创建两个要访问的对象
        Library book = new Book();
        Library article = new Article();
        //创建一个访问者代理
        Maneger m = new Maneger();
        //添加要访问的对象到代理中
        m.add(article);
        m.add(book);
        
        //进行访问
        m.action(v);
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 文本看得有点枯燥。但读到一个观点,觉得总结得很到位:“西方一切的文化都并到宗教里去了。” 思:不了解西方宗教,难以...
    Jolly6阅读 191评论 0 0
  • 日月沧桑了 我曾经住过十个月的一栋别墅 2017.2.6 小涛哥 斑驳的阳光照着孩子的心田 他不明白平静的...
    宋大圣阅读 130评论 0 4