• java设计模式之访问者(二)内嵌式访问者


    内嵌式访问者模式

    就是一棵树上的所有节点都有一个visit方法,每个父节点定义子节点的访问顺序。

    因为访问逻辑都在节点内部,得名内嵌式访问者

    下面展示一个demo,家谱是典型的树状结构,爷爷下面又爸爸和叔叔,爸爸下面又我和兄弟,依次访问。

    public abstract class Node {
       abstract void visit();
    }
    
    
    @Data
    @NoArgsConstructor
    public class GrandFather {
        
        private Father father;
        private Uncle uncle;
    
        public GrandFather(Father father, Uncle uncle) {
            this.father = father;
            this.uncle = uncle;
        }
        
        public void visit() {
            System.out.println("I am GrandFather!");
            father.visit();
            uncle.visit();
        }
    }
    
    @Data
    @NoArgsConstructor
    public class Father extends Node {
        private Me me;
        private Brother brother;
    
        public Father(Me me, Brother brother) {
            this.me = me;
            this.brother = brother;
        }
    
        @Override
        void visit() {
            System.out.println("I am Father!");
            me.visit();;
            brother.visit();
        }
    }
    
    
    @AllArgsConstructor
    @Data
    public class Uncle extends Node {
        @Override
        void visit() {
            System.out.println("I am uncle!");
        }
    }
    
    @AllArgsConstructor
    @Data
    public class Me extends Node {
        @Override
        void visit() {
            System.out.println("I am me!");
    
        }
    }
    
    @Data
    public class Brother extends Node {
        @Override
        void visit() {
            System.out.println("I am brother!");
        }
    }

    执行访问

    public class App {
        public static void main(String[] args) {
            GrandFather grandFather = new GrandFather();
            Father father = new Father();
            Uncle uncle = new Uncle();
            Me me = new Me();
            Brother brother = new Brother();
            grandFather.setFather(father);
            grandFather.setUncle(uncle);
            father.setBrother(brother);
            father.setMe(me);
            grandFather.visit();
    
        }
    }

    展示结果

    I am GrandFather!
    I am Father!
    I am me!
    I am brother!
    I am uncle!

    这种内嵌式访问者模式业务逻辑和控制逻辑耦合在一起,在节点很多的时候修改维护都很困难,下面将介绍另外一种访问者模式

  • 相关阅读:
    世界史上最著名的十大思想实验
    excel 鼠标上下左右移动
    excel 批注
    C# TextWriter类
    C#中的Hashtable
    cython安装、使用
    Java JsonPath grab InvalidPathException in code, you must be catching Java 7's java.nio.file.InvalidPathException instead of JsonPath's com.jayway.jsonpath.InvalidPathExceptio
    Java牛角尖【007】:Java中的Error能不能被Catch
    2016亚洲城市GDP50强出炉
    全国5A级旅游景区已达250家
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/16593972.html
Copyright © 2020-2023  润新知