gpt4 book ai didi

design-patterns - 访客模式与双重调度之间的区别

转载 作者:行者123 更新时间:2023-12-03 06:10:39 26 4
gpt4 key购买 nike

双重调度和访客模式有什么区别?

最佳答案

简而言之

它们来自不同的概念,在某些本身不支持双重调度的语言中,导致访问者模式作为连接两个(或更多)单个调度以获得多调度代理的方式。

多重调度的想法本质上是允许像这样的调用

void fn(virtual base_a*, virtual base_b*); (注意:不是作为类成员:这不是 C++!)

可以被覆盖为

void fn(virtual derived_a1*, virtual derived_b1*);
void fn(virtual derived_a2*, virtual derived_b1*);
void fn(virtual derived_a1*, virtual derived_b2*);
void fn(virtual derived_a2*, virtual derived_b2*);

这样,当调用时

fn(pa, pb)

调用被重定向到与 pa 的实际运行时类型相匹配的覆盖。和pb 。 (您可以将其推广到任意数量的参数)

在 C++、C#、Java 等语言中,这种机制不存在,运行时类型分派(dispatch)基本上只使用一个参数(这只是一个参数,通过使函数本身成为类的成员,将其隐含在函数中:

换句话说,伪代码

void fn(virtual base_a*, base_b*) 

成为(真正的C++)

class base_a
{
public:
virtual void fn(base_b*);
}

请注意,这里不再有 virtual前面base_b ,从现在开始是静态的。像这样的调用

pa->fn(pb)如果 pa 指向衍生_a2 并且 pb 指向衍生_b1 将被调度到衍生_a2::fn(base_b*),无论其中是否有衍生_a2::fn(衍生_b1*):不考虑pb指向的对象的运行时类型。

访问者模式的想法是,您调用一个对象的虚拟分派(dispatch),该对象调用(最终返回)另一个对象的虚拟分派(dispatch):

class base_a
{
public:
virtual void fn(base_b*)=0;
virtual void on_visit(derived_b1*)=0;
virtual void on_visit(derived_b2*)=0;
};

class base_b
{
public:
virtual void on_call(derived_a1*)=0;
virtual void on_call(derived_a2*)=0;
};

//forward declarations, to allow pointers free use in other decls.
class derived_a1;
class derived_b1;


class derived_a1: public base_a
{
public:
virtual void fn(base_b* pb) { pb->on_call(this); }
virtual void on_visit(derived_b1* p1) { /* useful stuff */ }
...
};

class derived_b1: public base_b
{
public:
virtual void on_call(derived_a1* pa1) { pa1->on_visit(this); }
...
};

现在,像pa->fn(pb)这样的电话,如果pa指向衍生_a1,pb指向衍生_b1,最终会转到derived_a1::on_visit(derived_b1*)

关于design-patterns - 访客模式与双重调度之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9818132/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com