访问者模式的概念:
访问者表示一个作用某个对象结构的各元素的操作。可以在不改变各个类的前提下定义作用这些元素的新操作。

目的:
把处理数据从数据结构中分离出来。有比较稳定的数据结构又有易于变化的算法。

好处:
访问者使得算法操作的增加变得简单,换句话说,就是访问者增加新操作很容易。增加一个新操作就相当于增加一个访问者,访问者模式就是一系列有关的行为集中到一个访问者对象中。

缺点:
虽然增加新操作很容易,但是增加新的数据结构变得困难。也就是说在原有的数据结构上增加新操作是很容易的,而要改变原有数据结构就变得很困难了。

先来看代码:

/** * 访问者基本抽象类 */public abstract class Visitor {    //访问方法a    public abstract void vistorA(ConcreteElementA concreteA);    //访问方法b    public abstract void vistorB(ConcreteElementB concreteB);}
/** * 定义一个接收抽象类,以一个访问者为参数 */public abstract class Element {    //接收者中传入访问者    public abstract void accept(Visitor visitor);}
/** * 具体访问者 */public class ConcreteVistorA extends Visitor {    @Override    public void vistorA(ConcreteElementA concreteA) {        //具体逻辑        Log.e("test", "concreteA" + "被" + "ConcreteVistorA" + "访问");    }    @Override    public void vistorB(ConcreteElementB concreteB) {        //具体逻辑        Log.e("test", "concreteB" + "被" + "ConcreteVistorA" + "访问");    }}
/** * 具体接收类 */public class ConcreteElementA extends Element {    @Override    public void accept(Visitor visitor) {        visitor.vistorA(this);    }    //其他方法    public void operationA() {    }}
/** * 提供一个高层的接口以允许访问者访问它的元素 */public class ObjectStructure {    private List<Element> elements = new ArrayList<>();    //添加接收者实例    public void add(Element element) {        elements.add(element);    }    //移除接收者实例    public void remove(Element element) {        if (elements.contains(element))            elements.remove(element);    }    //传入访问者实例,给每个接收者都添加传入的访问者实例    public void accept(Visitor visitor) {        for (Element element : elements) {            element.accept(visitor);        }    }}
//运行代码private void test() {        //实例化一个访问者可以访问它的元素的接口        ObjectStructure objectStructure = new ObjectStructure();        //添加一个接收者,例如这个接收者是个女人        objectStructure.add(new ConcreteElementA());        //实例化访问者a,那么访问者就是一种状态,例如失恋        ConcreteVistorA concreteVistorA = new ConcreteVistorA();        //实施访问        objectStructure.accept(concreteVistorA);        //最后的反应,当接收者女人拥有访问者失恋的状态的时候,那么就包含了失恋和女人在一起的反应,例如,哭,伤心        //ConcreteElementA访问了ConcreteVistorA    }

看代码可以看出,如果我们还要添加访问者或者被访问者(接收者)。
只需要实现访问者和被访问者抽象类。

在高级接口中我们分别添加访问者和被访问者,这样只要执行了objectStructure的accept方法,并且传入了访问者实例,所有的被访问元素都会被访问者调用到。

例如,接收者可以是女人,和男人。
访问者可以是各种状态,失恋,结婚。
当女人这个接收者被放进高级接口(ObjectStructure)中,并添加了一些列的访问者(失恋,结婚)。
最后就是在失恋中传入女人,这时候就是女人被失恋访问了。
那么这个女人的数据结构就变成了:
当女人失恋时,伤心
当女人结婚时,高兴
换句话说就是,女人访问了失恋,结果伤心。女人访问了结婚,结果高兴。

访问者也是一把双刃剑,访问者模式比较复杂但是它的能力非常大。如果不理解访问者模式,实在是不会去想用它的吧。

更多相关文章

  1. Android(安卓)Q分区存储权限变更及适配
  2. 如何用手机访问电脑本地 localhost 网页或者服务器, 以调试web项
  3. android异常 android.os.NetworkOnMainThreadException
  4. 访问http资源之HttpUrlConnection get、post请求
  5. Android客户端WebService访问接口(Ksoap2Android调用.net服务端)
  6. org.codehaus.jackson.map.JsonMappingException: No suitable c
  7. Android(安卓)广播接收器(短信拦截器 比较山寨)
  8. VideoView
  9. 安卓即使增加了权限也不可以访问网络

随机推荐

  1. 快乐学习Pandas入门篇:Pandas基础
  2. 「网工小白必备」全网最详细的网络基础之
  3. 网工小白必备」全网最详细的网络基础之IC
  4. 一文讲解图像插值算法原理!附Python实现
  5. 「网工小白必备」全网最详细的网络基础知
  6. PHP接口与抽象类实例
  7. 李士杰做一个独立的人性之人
  8. 一沟绝望的死水:模拟邮件服务器,批量注册利
  9. php学习笔记(接口与抽象类的区别与联系)
  10. 演示部分数组的排序,合并/交差并补等