• 访问者模式学习笔记


    访问者模式

    使用场景

    一些对象结构相对固定。但经常需要对该对象进行定制化操作。这个时候我们可以用到访问模式。

    • 那些结构固定的对象称为被受访者,它接受访问者的访问,并将自己做为参数,传递给访问者
    • 使用固定对象进行相关操作的类被称为访问者,它在上述调用后,获得了受访者对象的引用,因而可以对其进行操作

    file

    优缺点

    • 优点:将变化的访问跟实际的对象结构切分开来
    • 缺点:访问者和被访问者互相依赖

    一个demo

    file

    • 一个电脑有鼠标、键盘、显示器组成,这些组件都是受访者
    • 访问者ComputerPartDisplayVisitor可以访问这些部分

    受访者的统一抽象接口

    public interface ComputerPart {
       public void accept(ComputerPartVisitor computerPartVisitor);
    }
    

    一个具体的受访者实现:电脑的键盘部分

    public class Keyboard  implements ComputerPart {
     
       @Override
       public void accept(ComputerPartVisitor computerPartVisitor) {
          computerPartVisitor.visit(this);
       }
    }
    

    一个具体的受访者实现:电脑的显示器部分

    public class Monitor  implements ComputerPart {
     
       @Override
       public void accept(ComputerPartVisitor computerPartVisitor) {
          computerPartVisitor.visit(this);
       }
    }
    

    定义访问者的能访问哪些电脑部件接口:

    public interface ComputerPartVisitor {
       public void visit(Keyboard keyboard);
       public void visit(Monitor monitor);
    }
    

    基于上述接口定义具体的访问行为:

    public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
     
       @Override
       public void visit(Keyboard keyboard) {
          System.out.println("Displaying Keyboard.");
       }
     
       @Override
       public void visit(Monitor monitor) {
          System.out.println("Displaying Monitor.");
       }
    }
    

    将具体某个电脑部件,交给访问者访问

    public class VisitorPatternDemo {
       public static void main(String[] args) {
    	  //将键盘部分交给访问者访问
          ComputerPart computer = new Keyboard();
          computer.accept(new ComputerPartDisplayVisitor());
       }
    }
    

    另外一个demo

    JSqlParser中源码中,一个SQL由多部分组成,比如where条件部分、排序部分。这些部分的个性化访问,也使用了访问者模式

    参考资料

    https://www.runoob.com/design-pattern/visitor-pattern.html

    欢迎关注我的个人公众号"西北偏北UP",记录代码人生,行业思考,科技评论

  • 相关阅读:
    new
    如何在win7上面安装python的包
    进程
    网络编程模块的使用
    面向对象基础与实例
    类与对象的属性与使用方法
    基础面向对象与面向过程
    RE模块垃圾回收机制
    常用函数模块
    thinkphp6 find_in_set使用实例
  • 原文地址:https://www.cnblogs.com/niceshot/p/15871949.html
Copyright © 2020-2023  润新知