访问者模式可在不修改已有程序结构前提下,定义该类层次结构的操作,通过添加额外的访问者来完成对已有代码功能的提升,满足新增加的需求。
结构对象是使用访问者模式必须条件,且这个结构对象必须存在遍历自身各个对象的方法。类似于java中的collection概念了。
访问器类的开发人员必须清楚将要访问类层次结构的全部或部分设计细节。另在设计访问器类时,我们必须特别注意被访问的对象模型中可能会出现环状结构。
一、组成角色
1、访问者角色(Visitor):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。
2、具体访问者角色(Concrete Visitor):实现每个由访问者角色(Visitor)声明的操作。
3、元素角色(Element):定义一个Accept操作,它以一个访问者为参数。
4、具体元素角色(Concrete Element):实现由元素角色提供的Accept操作。
5、对象结构角色(Object Structure):这是使用访问者模式必备的角色。它要具备以下特征:能枚举它的元素;可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个复合(组合模式)或是一个集合,如一个列表或一个无序集合。
二、类图
Visitor模式可让不同的访问者对同一个对象集合进行访问;Visitor先调用Visitable类的方法,这个方法又回调到Visitor类。
首先要在原有类层次结构中添加accept方法,然后将这个类层次中的类放到一个对象结构中去,再去创建访问者角色。
三、实现
1、元素接口Visitable
package com.makocn.javapatterns.visitor;
public interface Visitable {
public void accept(Visitor visitor);
}
2、具体元素类NodeA、NodeB、NodeC
package com.makocn.javapatterns.visitor;
public class NodeA implements Visitable {
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
package com.makocn.javapatterns.visitor;
public class NodeB implements Visitable {
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
package com.makocn.javapatterns.visitor;
public class NodeC implements Visitable {
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
3、访问者接口Visitor
package com.makocn.javapatterns.visitor;
import java.util.Collection;
public interface Visitor {
public void visit(NodeA nodeA);
public void visit(NodeB nodeB);
public void visit(NodeC nodeC);
public void visitCollection(Collection collection);
}
4、具体访问者类VisitorA
package com.makocn.javapatterns.visitor;
import java.util.Collection;
import java.util.Iterator;
public class VisitorA implements Visitor {
public void visit(NodeA a) {
System.out.println("Execute visitNodeA method!");
}
public void visit(NodeB b) {
System.out.println("Execute visitNodeB method!");
}
public void visit(NodeC c) {
System.out.println("Execute visitNodeC method!");
}
public void visitCollection(Collection collection) {
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
Object o = iterator.next();
if (o instanceof Visitable)
((Visitable) o).accept(this);
}
}
}
5、客户端测试类VisitorTest
package com.makocn.javapatterns.visitor;
import java.util.ArrayList;
import java.util.List;
public class VisitorTest {
public static void main(String[] args) {
NodeA nodeA = new NodeA();
NodeB nodeB = new NodeB();
NodeC nodeC = new NodeC();
VisitorA visitorA = new VisitorA();
visitorA.visit(nodeA);
visitorA.visit(nodeB);
visitorA.visit(nodeC);
List<Visitable> list = new ArrayList<Visitable>();
list.add(nodeA);
list.add(nodeB);
list.add(nodeC);
visitorA.visitCollection(list);
}
}
对象结构这里没有实现,其元素类直接在客户端直接生成。有兴趣都可以去实现下。
在两个接口Visitor和Visitable中,确保Visitable很少变化,也就是说,确保不能老有新的Element元素类型加进来,可以变化的是访问者行为或操作,也就是Visitor的不同子类可以有多种,这样使用访问者模式最方便。
当然可采用java反射机制, 可以使对象集合中的对象可有变化。
四、优缺点
好处:
给原来类层次增加新操作,不必修改整个类层次,只需实现一个具体访问者角色就可以,这样符合开闭原则的要求。
每个具体的访问者角色都对应一个相关操作,因此如果一个操作需求有变,那么仅修改一个具体访问者角色,而不用改动整个类层次。
由于访问者模式为系统多提供了一层“访问者”,因此可在访问者中添加一些对元素角色的额外操作。
缺点:
开闭原则的遵循总是片面的。如果系统中类层次发生了变化,则必须修改访问者角色和每一个具体访问者角色,所以访问者角色不适合具体元素角色经常发生变化的情况。
访问者角色要执行与元素角色相关操作,就必须让元素角色将内部属性暴露出来,这就意味着其它对象也可访问,这破坏了元素角色的封装性。
在访问者模式中,元素与访问者之间能够传递的信息有限,这往往也会限制访问者模式的使用。
五、适用场景
1、需要对一个对象结构中的对象进行很多不同的且不相关的操作,为了避免让这些操作破坏这些对象的类。Visitor可将相关操作集中起来定义在一个类中。
2、当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
3、对于某对象结构中各元素的操作,如果需要在不修改各元素类的前提下定义作用于这些元素的新操作,也就是动态的增加新的方法可考虑访问者模式。
4、一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
相关推荐
访问者模式是一种行为设计模式,它使你可以在不修改对象结构的情况下,为对象添加新的操作。这种模式的核心在于将数据结构与对这些数据的操作解耦,使得增加新的操作变得容易,同时也允许独立地改变元素类和访问者类...
它通过引入一个新的角色——访问者,允许在不修改原有对象结构的基础上,增加新的功能。 **访问者模式的角色:** 1. **Element(元素)**:元素是对象结构中的基本组成单元,它可以是一个简单的对象或复杂的对象...
行为型模式如策略(Strategy)、观察者(Observer)、访问者(Visitor)和模板方法(Template Method),关注对象之间的交互和职责分配。 在Java中,设计模式的应用广泛且深入。例如,单例模式在系统配置、线程池等...
在本篇文章中,我们将深入探讨面向对象设计模式中的一个非常重要的模式——**Visitor(访问者)模式**。此模式属于行为型模式的一种,主要应用于在不修改现有类的情况下向其添加新功能。这对于保持代码的灵活性和可...
5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被分布 229 5.12.4 对发送者和接收者解耦 229 5.12.5 总结 231 第6...
3. **行为型模式**:包括策略(Strategy)、模板方法(Template Method)、观察者(Observer)、迭代器(Iterator)、访问者(Visitor)、责任链(Chain of Responsibility)、命令(Command)、备忘录(Memento)、...
行为型模式如观察者模式(Observer)、策略模式(Strategy)和访问者模式(Visitor),关注对象之间的交互和责任分配。 在C++中,设计模式的应用通常涉及到面向对象编程的特性,如继承、封装和多态。Qt4框架则为...
- 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 这些设计模式不仅在PHP中适用,也是跨语言的编程思想,可以帮助开发者...
C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式...22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)
### 设计模式精解——GoF23中设计模式解析 #### 重要性与起源 设计模式是软件工程领域的一项重要研究,它提供了一系列解决常见软件设计问题的模板。GoF23指的是由Erich Gamma、Richard Helm、Ralph Johnson和John ...
包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)...Strategy)、模板方法模式(Template Method)和访问者模式(Visitor)...
### 设计模式精解——GoF 23种设计模式解析及C++实现 #### 0. 引言 设计模式作为面向对象编程的核心组成部分,是软件开发者在长期实践中总结出来的最佳实践。通过深入理解这些设计模式,我们可以更好地进行面向...
10. 访问者模式(Visitor):在不改变类结构的情况下,为对象添加新的操作。 这份PPT涵盖了设计模式的全貌,对于初学者来说,是一个很好的学习资源。通过深入学习这些模式,开发者可以更好地理解和应用面向对象设计...
8. Visitor模式,访问者模式,表示一个作用于某对象结构中的各元素的操作。 9. ChainofResponsibility模式,责任链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 10. Iterator...
- **3.8 Visitor模式**:访问者模式定义一个作用于某对象结构中的各元素的操作。 - **3.9 Chain of Responsibility模式**:职责链模式允许多个处理者处理请求。 - **3.10 Iterator模式**:迭代器模式提供一种方法...
### 领悟设计模式——Template Method与Visitor模式解析 #### 概述 本文源自C/C++ User's Journal,这是一本曾广受好评的专业C++杂志中的一个栏目。通过情景对话的形式,深入浅出地介绍了C++中的两种重要设计模式...
### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是软件工程领域中一个极为重要的概念,它代表着一系列被广泛接受的解决特定问题的方法。GoF(Gang of Four)所提出的23种设计模式更是...