访问者模式学习笔记

访问者模式 使用场景

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

那些结构固定的对象称为被受访者,它接受访问者的访问,并将自己做为参数,传递给访问者

使用固定对象进行相关操作的类被称为访问者,它在上述调用后,获得了受访者对象的引用,因而可以对其进行操作

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",记录代码人生,行业思考,科技评论

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgzjzf.html