概述
文章目录
- 1. 概述
- 2. 使用实例
1. 概述
使用背景:
- 主要将数据结构与数据操作分离。
- 稳定的数据结构和易变的操作耦合问题。
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中。在被访问的类里面加一个对外提供接待访问者的接口。
定义:
《大话设计模式》
访问者模式( Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
菜鸟教程
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。
**类型:**行为型
结构:
《大话设计模式》
《深入设计模式》
适用场景:
《大话设计模式》
- 访问者模式的目的是要把处理从数据结构分离出来。很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。反之,如果这样的系统的数据结构对象易于变化,经常要有新的数据对象增加进来,就不适合使用访问者模式。
菜鸟教程
1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。
2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类。
《深入设计模式》
- 如果你需要对一个复杂对象结构 (例如对象树) 中的所有元素执行某些操作, 可使用访问者模式。
访问者模式通过在访问者对象中为多个目标类提供相同操作的变体, 让你能在属于不同类的一组对象上执行同一操作。
- 可使用访问者模式来清理辅助行为的业务逻辑。
该模式会将所有非主要的行为抽取到一组访问者类中, 使得程序的主要类能更专注于主要的工作。
- 当某个行为仅在类层次结构中的一些类中有意义, 而在其他类中没有意义时, 可使用该模式。
你可将该行为抽取到单独的访问者类中, 只需实现接收相关类的对象作为参数的访问者方法并将其他方法留空即可。
实现方式:
-
在访问者接口中声明一组 “访问” 方法, 分别对应程序中的每个具体元素类。
-
声明元素接口。 如果程序中已有元素类层次接口, 可在层次结构基类中添加抽象的 “接收” 方法。 该方法必须接受访问者对象作为参数。
-
在所有具体元素类中实现接收方法。 这些方法必须将调用重定向到当前元素对应的访问者对象中的访问者方法上。
-
元素类只能通过访问者接口与访问者进行交互。 不过访问者必须知晓所有的具体元素类,因为这些类在访问者方法中都被作为参数类型引用。
-
为每个无法在元素层次结构中实现的行为创建一个具体访问者类并实现所有的访问者方法。
你可能会遇到访问者需要访问元素类的部分私有成员变量的情况。 在这种情况下, 你要么将这些变量或方法设为公有, 这将破坏元素的封装; 要么将访问者类嵌入到元素类中。后一种方式只有在支持嵌套类的编程语言中才可能实现。
-
客户端必须创建访问者对象并通过 “接收” 方法将其传递给元素。
优点:
菜鸟教程
-
1、符合单一职责原则。
-
2、优秀的扩展性。
-
3、灵活性。
《深入设计模式》
- 开闭原则。 你可以引入在不同类对象上执行的新行为, 且无需对这些类做出修改。
- 单一职责原则。 可将同一行为的不同版本移到同一个类中。
- 访问者对象可以在与各种对象交互时收集一些有用的信息。 当你想要遍历一些复杂的对象结构 (例如对象树), 并在结构中的每个对象上应用访问者时, 这些信息可能会有所帮助。
缺点:
菜鸟教程
- 1、具体元素对访问者公布细节,违反了迪米特原则。
- 2、具体元素变更比较困难。
- 3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。
《深入设计模式》
- 每次在元素层次结构中添加或移除一个类时, 你都要更新所有的访问者。
- 在访问者同某个元素进行交互时, 它们可能没有访问元素私有成员变量和方法的必要权限。
与其他设计模式的联系:
《深入设计模式》
- 你可以将访问者模式视为命令模式的加强版本, 其对象可对不同类的多种对象执行操作。
- 你可以使用访问者对整个组合模式树执行操作。
- 可以同时使用访问者和迭代器模式来遍历复杂数据结构, 并对其中的元素执行所需操作, 即使这些元素所属的类完全不同
《图解设计模式》
-
lterator模式
Iterator模式和Visitor模式都是在某种数据结构上进行处理。Iterator模式用于逐个遍历保存在数据结构中的元素。
Visitor模式用于对保存在数据结构中的元素进行某种特定的处理。 -
Composite模式
有时访问者所访问的数据结构会使用Composite模式。 -
lnterpreter模式
在 Interpreter模式中,有时会使用Visitor模式。例如,在生成了语法树后,可能会使用Visitor模式访问语法树的各个节点进行处理。
2. 使用实例
《深入设计模式》
《重学Java设计模式》
最后
以上就是优美音响为你收集整理的设计模式学习笔记--访问者模式(详细笔记)的全部内容,希望文章能够帮你解决设计模式学习笔记--访问者模式(详细笔记)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复