• Java访问者模式


        

      

    结构对象会遍历它自己所保存的聚集中的所有节点,在本系统中就是节点NodeA和NodeB。首先NodeA会被访问到,这个访问是由以下的操作组成的:

      (1)NodeA对象的接受方法accept()被调用,并将VisitorA对象本身传入;

      (2)NodeA对象反过来调用VisitorA对象的访问方法,并将NodeA对象本身传入;

      (3)VisitorA对象调用NodeA对象的特有方法operationA()。

      从而就完成了双重分派过程,接着,NodeB会被访问,这个访问的过程和NodeA被访问的过程是一样的,这里不再叙述。

    适用于 数据结构稳定,再增加就比较困难

      

    /**
     * Created by nicknailo on 2018/9/1.
     */
    public class VisitorDesign {
        
        public static void main(String[] args) {
            //创建一个结构对象
            ObjectStructure os = new ObjectStructure();
            //给结构增加一个节点
            os.add(new NodeA());
            //给结构增加一个节点
            os.add(new NodeB());
            //创建一个访问者
            Visitor visitor = new VisitorB();
            os.action(visitor);
        }
    
    }
    interface Visitor {
        /** 对应于NodeA的访问操作 */
        public void visit(NodeA node);
    
        /** 对应于NodeB的访问操作 */
        public void visit(NodeB node);
    }
    class VisitorA implements Visitor {
        /** 对应于NodeA的访问操作 */
        @Override
        public void visit(NodeA node) {
            System.out.println(node.operationA());
        }
    
        /** 对应于NodeB的访问操作 */
        @Override
        public void visit(NodeB node) {
            System.out.println(node.operationB());
        }
    }
    class VisitorB implements Visitor {
        /** 对应于NodeA的访问操作 */
        @Override
        public void visit(NodeA node) {
            System.out.println(node.operationA());
        }
    
        /** 对应于NodeB的访问操作 */
        @Override
        public void visit(NodeB node) {
            System.out.println(node.operationB());
        }
    }
    interface  Node {
        /** 接受操作 */
        public abstract void accept(Visitor visitor);
    }
    class NodeA implements Node{
        /** 接受操作 */
        @Override
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
    
        /** NodeA特有的方法 */
        public String operationA(){
            return "NodeA";
        }
    }
    class NodeB implements Node{
        /** 接受方法 */
        @Override
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
    
        /** NodeB特有的方法 */
        public String operationB(){
            return "NodeB";
        }
    }
    class ObjectStructure {
    
        private List<Node> nodes = new ArrayList<Node>();
    
        /** 执行方法操作 */
        public void action(Visitor visitor) {
            for(Node node : nodes) {
                node.accept(visitor);
            }
        }
    
        /** 添加一个新元素 */
        public void add(Node node){
            nodes.add(node);
        }
    }

    运行后

    NodeA

    NodeB

  • 相关阅读:
    从上往下打印二叉树
    栈的压入、弹出序列
    连续子数组的最大和
    链表中环形的入口
    1月项目痛点
    problem:vue组件局部刷新,在组件销毁(destroyed)时取消刷新无效问题
    重点:浏览器的工作原理
    12月中旬项目中出现的几个bug解决方法的思考
    12月中项目问题复盘之对项目进度把控的反思
    problem: vue之数组元素中的数组类型值数据改变却无法在子组件视图更新问题
  • 原文地址:https://www.cnblogs.com/nicknailo/p/9915437.html
Copyright © 2020-2023  润新知