访问者模式是在编译器的解析器常用的设计模式,例如,Eclipse JDT AST解析器。
基本上,在访问者模式中有两个接口——访问者和元素。
1、访问者的故事
假设有一个第一次来到纽约的游客。他想去游览这个城市而且这个城市也接收他游览。一旦游客开始游览,就会自动游览所有的事物,并且当他想去一个博物馆的时候他不必去调用任何方法。这个旅游是一个package!
2、访问者模式类图
3、访问者模式的步骤
下面的图显示游览的步骤
工作流程就像下面描述的:
1.一个访问者FirstTimeVisitor和一个元素City被创建。
2.程序开始于"City accept a visitor"。
3.在City类中的accept方法定义了让这个访问者去访问。
4.被接受的访问者调用它的重载的方法"visit"来游览这个City。
4、访问者模式Java代码
public interface Element { public void accept(Visitor visitor); } public interface Visitor { public void visit(City city); public void visit(Museum museum); public void visit(Park park); } public class City implements Element { private List<Element> places = new ArrayList<Element>(); public City() { places.add(new Museum()); places.add(new Park()); } @Override public void accept(Visitor visitor) { // TODO Auto-generated method stub System.out.println("这个城市接收了这个访问者!"); visitor.visit(this); for (Element e : places) { e.accept(visitor); } } } public class Museum implements Element { @Override public void accept(Visitor visitor) { // TODO Auto-generated method stub System.out.println("Museum接收了这个访问者!"); visitor.visit(this); } } public class Park implements Element { @Override public void accept(Visitor visitor) { // TODO Auto-generated method stub System.out.println("Park接收了这个访问者!"); visitor.visit(this); } } public class FirstTimeVisitor implements Visitor { @Override public void visit(City city) { // TODO Auto-generated method stub System.out.println("我正在游览这个城市!"); } @Override public void visit(Museum museum) { // TODO Auto-generated method stub System.out.println("我正在游览这个博物馆!"); } @Override public void visit(Park park) { // TODO Auto-generated method stub System.out.println("我正在游览这个公园!"); } } public class Test { public static void main(String[] args) { FirstTimeVisitor visitor = new FirstTimeVisitor(); City city = new City(); city.accept(visitor); } }
输出:
这个城市接收了这个访问者!
我正在游览这个城市!
Museum接收了这个访问者!
我正在游览这个博物馆!
Park接收了这个访问者!
我正在游览这个公园!
我正在游览这个城市!
Museum接收了这个访问者!
我正在游览这个博物馆!
Park接收了这个访问者!
我正在游览这个公园!
5、JDK中实际应用
javax.lang.model.element.AnnotationValue显然用了访问者模式,但它在正常的工程中不常用到。
相关推荐
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。这些模式经过时间的考验,被广泛应用于各种面向对象的软件开发中,以提高代码的可读性、可维护性和可复用性。本教程旨在深入讲解...
例如责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator...Strategy)、模板方法模式(Template Method)和访问者模式(Visitor)等...
设计模式分为三类:创建型模式(如单例模式、工厂方法模式)、结构型模式(如代理模式、装饰器模式)和行为型模式(如观察者模式、策略模式)。每种模式都有其特定的用途和适用场景。 4. **具体设计模式详解** - ...
总之,《设计模式:基于C#的工程化实现及扩展》是一本对于C#开发者来说非常有价值的参考资料,它不仅讲解了设计模式的理论,还提供了丰富的实践案例,帮助读者掌握如何在实际项目中应用这些模式,提升软件开发的专业...
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 总结 ...
- **访问者模式**(Visitor):定义一个作用于某对象结构中的各元素的操作。 ### 使用设计模式的实际例子 以**组合模式**为例,假设我们需要设计一个系统来管理各种类型的电脑产品。我们可以定义一个抽象的`...
常见的行为型模式包括策略模式、模板方法模式、观察者模式、迭代器模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式和职责链模式。 在游戏引擎的开发中,设计模式能够以特定方式组织代码...
访问者模式是一种软件设计模式,它在对象结构中定义了一个访问者的接口,使得该访问者可以访问该结构中的每一个元素,同时不影响这些元素自身的行为。这种模式的主要目的是将数据操作和业务逻辑分离,使得数据结构...
3. **行为型模式**:包括责任链模式、命令模式、解释器模式、迭代器模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。这些模式主要处理对象之间的交互和职责分配。 例如,单例模式...
访问者模式是一种行为设计模式,它允许在不修改对象结构的情况下向对象添加新的操作。这种模式的核心思想是将数据结构与算法分离,使得算法可以在不改变对象结构的前提下增加对对象的操作。 在软件开发中,有时我们...
访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式将算法与数据结构分离,使得算法可以独立于数据结构进行变化,增强了系统的可扩展性。 在C++中...
访问者模式是一种软件设计模式,它在对象结构中定义了一个访问者的接口,使得该访问者可以访问该结构中的每一个元素,同时不影响对象结构本身。这种模式的主要目的是将数据操作与数据结构分离,使得数据结构的变化...
**访问者模式**是一种行为设计模式,它允许在不修改对象结构的情况下添加新的操作。这种模式主要用于处理具有复杂对象结构的情况,使得我们可以对结构中的每个元素执行特定操作,而无需暴露其内部实现。 访问者模式...
3. 行为型模式(Behavioral Patterns):这类模式关注对象之间的责任分配,如命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录模式(Memento)、观察者模式...
本系列视频“C#设计模式视频21-23”聚焦于三种行为型设计模式:访问者模式(Visitor Pattern)、策略模式(Strategy Pattern)以及状态模式(State Pattern)。这些模式都是为了提高代码的灵活性、可维护性和可扩展...
访问者模式(Visitor Pattern)是一种行为设计模式,它使你能在不修改对象结构的前提下向其添加新的操作。这种模式常用于处理具有相同接口或抽象类的对象结构,使得可以在不改变原有结构的基础上增加功能,实现对...
访问者模式(Visitor Pattern)是一种行为型设计模式,旨在不改变被访问对象结构的情况下,定义对其元素的新操作。访问者模式通过将操作封装在独立的类中,使得新的操作可以灵活地添加,而无需修改对象的结构。访问...
访问者模式是一种软件设计模式,它允许在不改变对象结构的情况下,在对象的现有结构上增加新的操作。在Java中,这种模式尤其有用,因为它能够帮助我们保持类的封装性,同时提供了一种灵活的方式来扩展对象的功能。...