"Dispatcher" 设计模式是什么?

15

"Dispatcher" 模式是什么,我该如何在代码中实现它?

我有一个泛型对象的属性包,并希望将其检索委托给一个泛型方法。

目前,我有一些属性在包中查找特定的键。例如:

private Dictionary<String, Object> Foo { get; set; }
private const String WidgetKey = "WIDGETKEY";

public Widget? WidgetItem
{
    get
    {
        return Foo.ContainsKey(WidgetKey) ? Foo[WidgetKey] as Widget: null;
    }
    set
    {
        if (Foo.ContainsKey(WidgetKey))
            Foo[WidgetKey] = value;
        else
            Foo.Add(WidgetKey, value);
    }
}

有人建议使用“调度器”模式可以使其更加通用,但我一直找不到一个好的描述或示例。

我正在寻找一种更通用的方法来处理属性包的存储和检索。

1个回答

13

我不确定我正确理解了你的问题,但是...

我有一个通用对象的属性包,想委托其检索给一个通用方法。

...听起来你正在寻求关于“双重分派”的信息?

假设你有三个类:

abstract class A {}
class B extends A {}
class C extends A {}

还有两种方法可以对B类型和C类型的对象执行某些操作:

void DoSomething(B obj) {}
void DoSomething(C obj) {}
问题在于当你只有一个静态类型 A 的变量时...:
A a = new B();

在编译时,只有其静态类型(A)是已知的,因此您不能调用DoSomething(a),因为编译器无法确定它是否应调用方法DoSomething(B obj)还是DoSomething(C obj)。

这就是双重分派的作用。有些语言可以直接支持它,而像C++、C#和Java这样的语言则不行。但是您也可以在这些语言中自己实现它。请参见以下示例:

http://en.wikipedia.org/wiki/Double_dispatch

以及:

http://en.wikipedia.org/wiki/Visitor_pattern


3
在第一个维基百科文章中提到,“在C#中,可以通过将传递给动态类型的参数进行强制转换来实现多重分派,而无需使用访问者模式。” - Damian Green
@DamianGreen - 这个引用并没有错,但是非常危险。dynamic是一种类型,可以绕过所有编译时检查,如果类型与您尝试执行的操作不匹配,则会在运行时出现错误。例如,(int)"text"不是有效的并且无法编译,但是(int)(dynamic)"text"对于编译器来说完全可以,并且在代码到达那里时会引发异常。有些情况下需要使用dynamic,但应该仔细考虑。_(添加这个延迟很久的评论主要是为了将来访问此答案的任何人。)_ - Bobson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接