• 访问者模式


    一、定义

    访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

    双分派:对于消息表达式a.m(b),能够按照a和b的实际类型为其绑定对应方法体。

    二、示例代码

    public abstract class Element {
        public abstract void accept(Visitor visitor);
    }
    
    public  class ConcreteElementA extends Element{
        @Override
        public void accept(Visitor visitor) {
                visitor.visitConcreteElementA(this);
        }
    }
    
    public class ConcreteElementB extends Element {
        @Override
        public void accept(Visitor visitor) {
            visitor.visitConcreteElementB(this);
        }
    }
    
    public abstract class Visitor {
        public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
        public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
    
    }
    
    public class ConcreteVisitor1 extends Visitor {
        @Override
        public void visitConcreteElementA(ConcreteElementA concreteElementA) {
            System.out.println("对象:" + concreteElementA.getClass().getName() + "被" + concreteElementA.getClass().getName() + this.getClass().getName() + "访问");
    
        }
    
        @Override
        public void visitConcreteElementB(ConcreteElementB concreteElementB) {
            System.out.println("对象:" + concreteElementB.getClass().getName() + "被" + concreteElementB.getClass().getName() + this.getClass().getName() + "访问");
    
        }
    }
    
    public class ConcreteVisitor2 extends Visitor {
        @Override
        public void visitConcreteElementA(ConcreteElementA concreteElementA) {
            System.out.println("对象:" + concreteElementA.getClass().getName() + "被" + concreteElementA.getClass().getName() + this.getClass().getName() + "访问");
    
        }
    
        @Override
        public void visitConcreteElementB(ConcreteElementB concreteElementB) {
            System.out.println("对象:" + concreteElementB.getClass().getName() + "被" + concreteElementB.getClass().getName() + this.getClass().getName() + "访问");
    
        }
    }
    
    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 e : elements
            ) {
                e.accept(visitor);
    
            }
        }
    }
    
    public class Client {
        public static void main(String[] args) {
    
            ObjectStructure objectStructure = new ObjectStructure();
            objectStructure.attach(new ConcreteElementA());
            objectStructure.attach(new ConcreteElementB());
    
            Visitor concreteVisitor1 = new ConcreteVisitor1();
            Visitor concreteVisitor2 = new ConcreteVisitor2();
            objectStructure.accept(concreteVisitor1);
            objectStructure.accept(concreteVisitor2);
    
        }
    }
    
    
  • 相关阅读:
    第二次编程作业总结
    structs get 方法乱码问题
    网址记录
    尸体解剖报告
    最后冲刺
    回答自己的提问——对自己最大的反馈
    构建之法13-17章读后感
    典型场景
    对其他各团队的评价
    用户调研
  • 原文地址:https://www.cnblogs.com/yfy-/p/12269261.html
Copyright © 2020-2023  润新知