前言
月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂)
央是一片海洋,海乃百川,代表着一块海绵(吸纳万物)
泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出)
月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容
希望大家一起坚持这个过程,也同样希望大家最终都能从零到零,把知识从薄变厚,再由厚变薄!
一、什么是访问者模式?
访问者模式是一种行为型设计模式,它允许你将算法与对象结构分离。通过此模式,你可以在不修改现有类的情况下向现有类层次结构中添加新的行为。
在访问者模式中,有两类对象:元素和访问者。元素是一个具有某些接受访问者的方法的对象,而访问者是一个实现了访问者接口的对象,该接口定义了访问者如何访问元素。
二、访问者模式的优缺点:
优点:
-
增加新的操作很容易,只需要增加一个新的访问者即可,不需要修改原有的代码。
-
将数据结构与操作分离,使得数据结构可以独立于操作而变化,而操作也可以独立于数据结构而变化。
-
可以避免使用大量的条件语句来判断数据结构中的元素类型,使代码更加清晰简洁。
-
可以提高代码的复用性和扩展性,使得系统更加灵活。
缺点:
-
增加了类的数目,使得系统更加复杂。
-
访问者模式中的数据结构必须支持迭代器,这限制了一些数据结构的使用。
-
访问者模式实现起来比较复杂,需要对访问者、元素等多个类进行设计和编码。
三、访问者模式的结构:
(1)Visitor:接口或者抽象类,它定义了对每一个元素(Element)访问的行为,它的参数就是可以访问的元素,它的方法数理论上来讲与元素个数是一样的,因此,访问者模式要求元素的类族要稳定,如果经常添加、移除元素类,必然会导致频繁地修改Visitor接口,如果这样则不适合使用访问者模式。
(2)ConcreteVisitor1、ConcreteVisitor2:具体的访问类,它需要给出对每一个元素类访问时所产生的具体行为。
(3)Element:元素接口或者抽象类,它定义了一个接受访问者的方法(Accept),其意义是指每一个元素都要可以被访问者访问。
(4)ConcreteElementA、ConcreteElementB:具体的元素类,它提供接受访问方法的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法。
(5)ObjectStructure:定义当中所说的对象结构,管理了元素集合,并且可以迭代这些元素供访问者访问。
四、访问者模式实战:
以上图为例
1.创建元素
2.创建visitor
3.创建objectStructure
4.测试
5.测试结果
五.总结:
访问者模式的应用场景包括:
-
编译器的语法树遍历:访问者模式可以用于遍历语法树并执行特定的操作,例如生成中间代码,执行优化等。
-
数据库操作:访问者模式可以用于查询数据库并执行特定的操作,例如计算平均值,求和等。
-
GUI组件:访问者模式可以用于遍历GUI组件并执行特定的操作,例如更新UI,处理输入事件等。
-
XML解析:访问者模式可以用于遍历XML文档并执行特定的操作,例如生成HTML页面,提取数据等。
-
设计模式中的其他模式:访问者模式可以与其他设计模式一起使用,例如组合模式,迭代器模式等。