visitor访问者模式的意图,在《设计模式》里这样描述:“表示一个作用于某个对象结构中的各元素的操作。它使可以在不改变各元素的类的前提下定义作用于这些元素的新操作。”。就是说:在坚持“开闭原则”的情况下,访问者可以用来扩展一个现有的类层次结构来实现新的行为。更通俗的讲,如果不愿意修改类层次结构内部代码或者类层次结构的代码难以修改的情况下,如果该类层次结构在设计实现时使用了visitor访问者模式,那么可以实现“在不修改类层次结构代码的前提下”进行扩展。
但是visitor访问者模式是一个有争议的模式,在《Design Paterns Java Workbook》(作者Steven John Metsker)里提到了三种代替方案。
《Software Architecture Design Patterns in Java》中的例子:
public interface VisitorInterface {
public void visit(NonCaliforniaOrder nco);
public void visit(CaliforniaOrder co);
public void visit(OverseasOrder oo);
}
public class OrderVisitor implements VisitorInterface {
private double orderTotal;
public OrderVisitor() {
}
public void visit(NonCaliforniaOrder inp_order) {
orderTotal = orderTotal + inp_order.getOrderAmount();
}
public void visit(CaliforniaOrder inp_order) {
orderTotal = orderTotal + inp_order.getOrderAmount() +
inp_order.getAdditionalTax();
}
public void visit(OverseasOrder inp_order) {
orderTotal = orderTotal + inp_order.getOrderAmount() +
inp_order.getAdditionalSH();
}
public double getOrderTotal() {
return orderTotal;
}
}
public class OverseasOrder implements Order {
private double orderAmount;
private double additionalSH;
public OverseasOrder() {
}
public OverseasOrder(double inp_orderAmount,
double inp_additionalSH) {
orderAmount = inp_orderAmount;
additionalSH = inp_additionalSH;
}
public double getOrderAmount() {
return orderAmount;
}
public double getAdditionalSH() {
return additionalSH;
}
public void accept(OrderVisitor v) {
v.visit(this);
}
}
public class CaliforniaOrder implements Order {
private double orderAmount;
private double additionalTax;
public CaliforniaOrder() {
}
public CaliforniaOrder(double inp_orderAmount,
double inp_additionalTax) {
orderAmount = inp_orderAmount;
additionalTax = inp_additionalTax;
}
public double getOrderAmount() {
return orderAmount;
}
public double getAdditionalTax() {
return additionalTax;
}
public void accept(OrderVisitor v) {
v.visit(this);
}
}
public class NonCaliforniaOrder implements Order {
private double orderAmount;
public NonCaliforniaOrder() {
}
public NonCaliforniaOrder(double inp_orderAmount) {
orderAmount = inp_orderAmount;
}
public double getOrderAmount() {
return orderAmount;
}
public void accept(OrderVisitor v) {
v.visit(this);
}
}
分享到:
相关推荐
### C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式 #### 概述 在本篇文章中,我们将深入探讨面向对象设计模式中的一个非常重要的模式——**Visitor(访问者)模式**。此模式属于行为型模式的一...
C#面向对象设计模式 (行为型模式) Visitor 访问者模式 视频讲座下载
访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 紧接着,给出其类结构图。 访问者模式适用于数据结构相对稳定的系统,它把...
C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式.rar 李建忠主讲 上海祝成信息科技有限公司担任软件架构师,并讲授C#/.NET软件开发课程
访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式将算法与数据结构分离,使得算法可以独立于数据结构进行变化,增强了系统的可扩展性。 在C++中...
C#设计模式之Visitor访问者模式解决长隆欢乐世界问题实例 一、理论定义 访问者模式提供了一组集合对象统一的访问接口,适合对一个集合中的对象,进行逻辑操作,使数据结构和逻辑结构分离。它可以使得对象结构和...
**访问者模式(Visitor)详解** 访问者模式是一种行为设计模式,它使你可以在不修改对象结构的情况下,为对象添加新的操作。这种模式的核心在于将数据结构与对这些数据的操作解耦,使得增加新的操作变得容易,同时...
可以看到,要实现操作权转让到 Visitor,核心是元素必须实现一个 Accept 函数,将这个对象抛给 Visitor:从上面代码可以看出这样一条链路:Ele
**访问者模式(VisitorPattern)** 访问者模式是一种行为设计模式,它使你能在不修改对象结构的前提下向对象添加新的操作。这种模式常用于处理具有复杂逻辑的对象结构,特别是当你需要对这些对象进行多态操作时。访问...
**访问者模式(Visitor Pattern)**是一种行为设计模式,它提供了一种在不修改对象结构的情况下增加新操作的方法。这种模式的主要思想是将数据结构与算法分离,使得算法可以在不改变对象结构的情况下独立变化。 在...
访问者模式(Visitor Pattern)是一种行为设计模式,它在不修改已有对象结构的情况下,为对象增加新的功能。这种模式在PHP和其他面向对象编程语言中都得到了广泛应用,尤其在需要对对象进行多样化操作,且不想破坏...
本项目基于“visitor模式”和“访问者模式”,实现了用于计算表达式的求值引擎,这涉及到一种将数学表达式转化为数据结构(表达式树)的方法,然后通过遍历该树来执行计算。下面我们将详细探讨这些概念。 1. **...
《访问者模式在实际开发中的应用深度解析》 访问者模式是设计模式中的一种行为模式,它在实际的软件开发中具有重要的应用价值。通过理解并掌握访问者模式,开发者可以更好地实现对象结构中元素的操作,同时保持元素...
访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式的核心思想是分离了算法和对象结构,使得算法可以在不改变对象结构的情况下独立变化。 访问者...
**访问者模式**是一种行为设计模式,它允许在不修改对象结构的情况下添加新的操作。这种模式主要用于处理具有复杂对象结构的情况,使得我们可以对结构中的每个元素执行特定操作,而无需暴露其内部实现。 访问者模式...
访问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式。它表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。从定义可以看出,...