什么是"Dispatcher"设计模式?

Ben*_*mer 10 .net c# generics design-patterns

什么是"调度程序"模式以及如何在代码中实现它?

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

目前,我有物业在包中寻找特定的钥匙.例如:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

有人建议,这可能是"调度员"模式更通用,但我一直无法找到一个好的描述或例子.

我正在寻找一种更通用的方式来处理属性包存储/检索.

stm*_*max 10

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

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

...听起来你正在寻找有关"双重调度"的信息?

想象一下,你有三个班:

abstract class A {}
class B extends A {}
class C extends A {}
Run Code Online (Sandbox Code Playgroud)

还有两种方法可以处理B类和C类对象:

void DoSomething(B obj) {}
void DoSomething(C obj) {}
Run Code Online (Sandbox Code Playgroud)

问题是,当你拥有的是一个静态类型A的变量...时:

A a = new B();
Run Code Online (Sandbox Code Playgroud)

...你不能调用DoSomething(a)因为在编译时只有它的静态类型(A)是已知的,所以编译器无法决定它是否应该调用方法DoSomething(B obj)或DoSomething(C obj).

这就是双重调度的用武之地.有些语言支持开箱即用,其他语言如C++,C#和Java则不支持.但您也可以使用这些语言自己实现它.有关示例,请参阅:

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

和:

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

  • 第一篇维基百科文章指出,在C#中,可以在不使用访问者模式的情况下实现多次调度.这是通过简单地将传递的对象转换为动态'来完成的 (2认同)