Visitor - 访问者模式
概述:
访问数据结构并处理数据
visitor 模式中,数据结构与处理是分离开来的
说明:
1.本文仅仅是对 图解设计模式 的简单总结(个人笔记).
2.文章中的图片均来自本书,添加水印只是为了防止盗链行为,并无侵权的想法.
综上,若侵权, 请联系我删除!
转载请标注出处!
案例:
案例说明:
使用composite模式中用的那个文件和文件夹作为访问者要访问的数据结构
类图:
主要代码:
ListVisitor.java
package Gof.Visitor; import java.util.Iterator; public class ListVisitor extends Visitor { private String currentdir = ""; // 当前访问的文件夹的名字 public void visit(File file) { // 在访问文件时被调用 System.out.println(currentdir + "/" + file); } public void visit(Directory directory) { // 在访问文件夹时被调用 System.out.println(currentdir + "/" + directory); String savedir = currentdir; currentdir = currentdir + "/" + directory.getName(); Iterator it = directory.iterator(); while (it.hasNext()) { Entry entry = (Entry)it.next(); entry.accept(this); } currentdir = savedir; } }
时序图:
代码链接:传送门
uml综述
Visitor: visitor负责对数据结构中的每个具体的元素(concreteElement)声明一个用于访问xxx的xxxVisitor方法
ConcreteVisitor: 实现visitor角色所定义的接口
Element : 表示visitor 要访问的对象
ConcreteElement: 实现element定义的方法
ObjectStructure : 负责处理element角色的集合
收获:
- 开闭原则:对扩展开放,对修改关闭,即在不修改源代码的情况下,进行扩展(提高组件复用性)
- 在Visitor模式中,concreteElement 和concreteVisitor这两个角色共同决定了实际进行的处理,这种消息处理一般叫做双重分发
- visitor目的是将处理从数据结构中分离开来,在本示例程序中,visitor提高了File和directory作为组件的独立性
- Visitor 工作所需的条件:element必须向visitor提供足够多的信息,但若公开了不应当公开的信息,将来对数据结构的改良就会变得非常困难
相关设计模式:
- Iterator: 用于逐个遍历保存在数据结构中的元素
- Visitor: 对保存在数据结构中的元素进行某种特殊的处理
- Composite: visitor可能使用composite 模式
- Interpreter: 使用visitor访问语法树
Question:
Java对使用final修饰的类是无法继承的,如java.lang.String, String类貌似违背了开闭原则,但这实际上是有正当理由的,原因是?
Answer:
效率原因,String是Java的基本类, java编译器以”不能继承String类”为前提,会对基本类String类的处理速度和内存消耗量都进行优化
注意:
此部分内容属于对GOF Design Pattern知识的初步认知阶段,参考书籍是结城浩的《图解设计模式》,简单易懂,十分推荐!
以上内容,作者一字一句码出来的,纯属不易,欢迎大家转载,转载是还请您表明出处。另外如果我有侵权行为,请在下方留言,确认后我会及时撤销相应内容,谢谢大家!
PS:欢迎大家来到我的小站,鸣谢!
猜你喜欢