美文网首页
Java设计模式----访问者模式

Java设计模式----访问者模式

作者: GaaraZ | 来源:发表于2018-07-06 16:50 被阅读18次

模式动机

对于存储在一个集合中的对象,他们可能具有不同的类型(即使有一个公共的接口),对于该集合中的对象,可以接受一类称为访问者的对象来访问,不同的访问者其访问方式也有所不同。

定义

表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

结构图

访问者模式

基本代码

package visitor;

public interface Visitor {
    void visitConcreteElementA(ConcreteElementA concreteElementA);
    void visitConcreteElementB(ConcreteElementB concreteElementB);
}
package visitor;

public interface Element {
    void accept(Visitor visitor);
}
package visitor;

public class ConcreteElementA implements Element{
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementA(this);
    }
}
package visitor;

public class ConcreteElementB implements Element {
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementB(this);
    }
}
package visitor;

public class ConcreteVisitor1 implements Visitor{
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
        System.out.println(concreteElementA.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
    }

    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
        System.out.println(concreteElementB.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
    }
}
package visitor;

public class ConcreteVisitor2 implements Visitor{
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
        System.out.println(concreteElementA.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
    }

    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
        System.out.println(concreteElementB.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
    }
}
package visitor;

import java.util.ArrayList;
import java.util.List;

public class ObjectStructure {
    private List<Element> elements = new ArrayList<Element>();

    public void attach(Element element){
        elements.add(element);
    }

    public void detach(Element element){
        elements.remove(element);
    }

    public void accept(Visitor visitor){
        for (Element element:elements){
            element.accept(visitor);
        }
    }
}
package visitor;

public class Client {
    public static void main(String[] args) {
        ObjectStructure o = new ObjectStructure();
        o.attach(new ConcreteElementA());
        o.attach(new ConcreteElementB());

        ConcreteVisitor1 visitor1 = new ConcreteVisitor1();
        ConcreteVisitor2 visitor2 = new ConcreteVisitor2();

        o.accept(visitor1);
        o.accept(visitor2);
    }
}

开发中的场景

  • XML文档解析器设计
  • 编译器的设计
  • 复杂集合对象的处理

小结

访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。

目的

访问者模式的目的是要把处理从数据结构分离出来。很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。反之,如果这样的系统数据结构相对易于变化,经常要有新的数据对象增加进来,就不适合使用访问者模式。

优点

增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。

缺点

使增加新的数据结构变得困难。

相关文章

  • Java设计模式<访问者模式>

    Java设计模式<访问者模式> 意图 将对象的结构和操作分离 角色 抽象访问者:抽象类或者接口,声明访问者可以访问...

  • [Android]设计模式-访问者模式

    [Android]设计模式-访问者模式 访问者模式 Visitor 【备注】只用于个人收藏

  • 设计模式[23]-访问者模式-Visitor Pattern

    1.访问者模式简介 访问者模式(Visitor Pattern)模式是行为型(Behavioral)设计模式,提供...

  • 访问者模式

    《java与模式》中是这样描述访问者模式作用的: 访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种...

  • 设计模式之访问者(Visitor)

    访问者模式,是行为型设计模式之一。访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式...

  • Java设计模式系列-外观模式

    原创文章,转载请标注出处:《Java设计模式系列-外观模式》 一、概述 外观模式,一般用在子系统与访问者之间,用于...

  • 访问者模式

    Java的设计模式很多,以前看过很多遍,最近才搞懂了访问者模式,真是惭愧,看了一些github的源码有一些访问者模...

  • 访问者模式一篇就够了

    访问者模式介绍 最复杂的设计模式,并且使用频率不高,《设计模式》的作者评价为:大多情况下,你不需要使用访问者模式,...

  • 访问者模式

    访问者模式属于行为型模式。访问者模式是一种将数据结构和数据操作分离的设计模式。访问者模式比较复杂,而且实际使用的地...

  • 设计模式——访问者模式

    在阎宏博士的《JAVA与模式》一书中开头是这样描述访问者(Visitor)模式的:访问者模式是对象的行为模式。访问...

网友评论

      本文标题:Java设计模式----访问者模式

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