设计模式学习—24访问者模式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_33334951/article/details/102702156

访问者模式

UML

访问者模式

解释说明

  • 访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
  • 访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解开,使操作集合可以相对自由地演化。
  • 注意:访问者模式会使新增数据结构变得困难。

代码实现

  • Element.class
package learn24;

public abstract class Element {
    public abstract void accept(Visitor visitor);
}
  • Visitor.class
package learn24;

public abstract class Visitor {
    public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);

    public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}
  • ConcreteElementA.class
package learn24;

public class ConcreteElementA extends Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementA(this);
    }

    public void operationA() {

    }
}
  • ConcreteElementB.class
package learn24;

public class ConcreteElementB extends Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementB(this);
    }

    public void operationA() {

    }
}
  • ConcreteVisitor1.class
package learn24;

public class ConcreteVisitor1 extends Visitor {
    @Override
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
        System.out.println(String.format("%s被%s访问", concreteElementA.getClass().getName(), this.getClass().getName()));
    }

    @Override
    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
        System.out.println(String.format("%s被%s访问", concreteElementB.getClass().getName(), this.getClass().getName()));
    }
}
  • ConcreteVisitor2.class
package learn24;

public class ConcreteVisitor2 extends Visitor {
    @Override
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
        System.out.println(String.format("%s被%s访问", concreteElementA.getClass().getName(), this.getClass().getName()));
    }

    @Override
    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
        System.out.println(String.format("%s被%s访问", concreteElementB.getClass().getName(), this.getClass().getName()));
    }
}
  • ObjectStructure.class
package learn24;

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

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

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

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

    public void accept(Visitor visitor) {
        for (Element e :
                elements) {
            e.accept(visitor);
        }
    }
}
  • Main.class
import learn24.*;

public class Main {

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

        ConcreteVisitor1 v1 = new ConcreteVisitor1();
        ConcreteVisitor2 v2 = new ConcreteVisitor2();

        o.accept(v1);
        o.accept(v2);
    }
}

参考资料

  • 大话设计模式

猜你喜欢

转载自blog.csdn.net/qq_33334951/article/details/102702156