设计模式之访问者模式
参考博文:https://www.cnblogs.com/jiaoyiping/p/9769554.html 侵权删除
2019-06-28 11:22:29
访问者模式 Visitor
分派概念的介绍:(访问者模式中使用了双分派)
静态分派:发生在编译时期,分派根据静态类型信息发生。例如,方法重载就是静态分派。
动态分派:发生在运行时期,动态分派动态地置换掉某个方法。例如,抽象父类引用指向具体子类。
什么是访问者模式:封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。(即在不改变数据基本结构的前提下扩展功能)
适用性:对象结构稳定的前提下,扩展功能。
访问者模式最大的限制:要求对象结构稳定。(不然会导致Visitor抽象类变化,抽象类变化不符合设计原则)。
访问者模式的基本类图:
访问者模式的基本成员:
抽象访问者(Visitor)角色:声明了一个或者多个方法操作,形成所有的具体访问者角色必须实现的接口。
具体访问者(ConcreteVisitor)角色:实现抽象访问者所声明的接口,也就是抽象访问者所声明的各个访问操作。
抽象节点(Element)角色:声明一个接受操作,接受一个访问者对象作为一个参数。
具体节点(ConcreteElement)角色:结构对象中的具体单元,实现了抽象节点所规定的接受操作。
结构对象(ObjectStructure)角色:具体单元的容器,有如下的责任,可以遍历结构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素;如果需要,可以设计成一个复合对象或者一个聚集,如List或Set。
访问者模式的基本代码要点:
两次分派:第一次分派ConcreteElement,第二次分派ConcreteVisitor。
扩展功能的方式,增加Visitor 子类。
访问者模式的基本代码:(参考博文)
public class Client { public static void main(String[] args) { //创建一个结构对象 ObjectStructure os = new ObjectStructure(); //给结构增加一个节点 os.add(new NodeA()); //给结构增加一个节点 os.add(new NodeB()); Visitor visitor = new VisitorA(); //创建一个访问者 os.action(visitor); //两次分派; 先找到具体的Node对象,然后找到具体的visitor,然后执行具体visitor 中的代码 } }