我已经看到了几个例子来演示访客模式。在所有这些方法中,每个派生的访问元素都实现了通常称为Accept()方法的方法。
在颜色层次结构中,此方法可能看起来像:
void Red::accept(Visitor *v)
{
v->visit(*this);
}
void Blue::accept(Visitor *v)
{
v->visit(*this);
}
当访问者及其继承者拥有以下方法时:
visit(Red red);
visit(Blue blue)
我的问题是,为什么不以同样的方式只在基类中实现它(在本例中:Color
),多态性将完成这项工作,也就是说,将调用正确的访问,因为当对象是Red
时,this的动态类型是Red
,所以取消引用它将产生Red
,这反过来将导致调用访问(Red)?
我错过了什么?
我的理解是,在基类方法中,这个
指针属于base类型,而不是任何派生类,因此它只能访问基类方法,并作为typeColor*this
传递。当传递给visit方法时,它会尝试运行visit(Color*Color)
,因为多态行为只适用于类本身的方法(而不是其他类)。
如果你唯一的接受
是...
void Color::accept(Visitor* v)
{
v->visit(*this);
}
visit
只会被基类调用。为了使用正确的派生类调用visit
,您需要每个颜色
来实现它,这样他们就可以传递正确键入的this
,因此调用正确的visit
重载。
继承多态性(动态分派)不适用于函数参数。换句话说,重载函数是根据所传递参数的静态类型选择的。如果在基类Color
中实现,则v-
模式定义 表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)。 class Visitor; class Element { public: virtual void accept(Visitor& visitor) = 0; //第一次多态辨析 virtual ~Element() {} }; class Eleme
问题 你要处理由大量不同类型的对象组成的复杂数据结构,每一个对象都需要进行不同的处理。 比如,遍历一个树形结构,然后根据每个节点的相应状态执行不同的操作。 解决方案 这里遇到的问题在编程领域中是很普遍的,有时候会构建一个由大量不同对象组成的数据结构。 假设你要写一个表示数学表达式的程序,那么你可能需要定义如下的类: class Node: pass class UnaryOperator
主要内容:介绍,实现,ComputerPart.java,Keyboard.java,Monitor.java,Mouse.java,Computer.java,ComputerPartVisitor.java,ComputerPartDisplayVisitor.java,VisitorPatternDemo.java在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行
亦称: Visitor 意图 访问者模式是一种行为设计模式, 它能将算法与其所作用的对象隔离开来。 问题 假如你的团队开发了一款能够使用巨型图像中地理信息的应用程序。 图像中的每个节点既能代表复杂实体 (例如一座城市), 也能代表更精细的对象 (例如工业区和旅游景点等)。 如果节点代表的真实对象之间存在公路, 那么这些节点就会相互连接。 在程序内部, 每个节点的类型都由其所属的类来表示, 每个特定
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 介绍 意图:主要将数据结构与数据操作分离。 主要解决:稳定的数据结构和易变的操作耦合问题。 何时使用:需要对一个对象结构中的对象进行
简介 访问者模式是一种将算法与对象结构分离的软件设计模式。 这个模式的基本想法如下:首先我们拥有一个由许多对象构成的对象结构,这些对象的类都拥有一个accept方法用来接受访问者对象;访问者是一个接口,它拥有一个visit方法,这个方法对访问到的对象结构中不同类型的元素作出不同的反应;在对象结构的一次访问过程中,我们遍历整个对象结构,对每一个元素都实施accept方法,在每一个元素的accept方