【问题标题】:What is the "Dispatcher" design pattern?什么是“调度程序”设计模式?
【发布时间】:2010-03-17 20:14:57
【问题描述】:

什么是“调度程序”模式,我将如何在代码中实现它?

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

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

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);
    }
}

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

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

【问题讨论】:

    标签: c# .net design-patterns generics


    【解决方案1】:

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

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

    ...听起来您正在寻找有关“双重调度”的信息?

    假设你有三个类:

    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();
    

    ...你不能调用 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# 中,可以在不使用访问者模式的情况下实现多次调度。这是通过简单地将传递的对象转换为动态的'
    • @DamianGreen - 这句话没有错,但非常危险。 dynamic 是一种绕过所有编译时检查的类型,如果该类型与您尝试执行的操作不符,它将在运行时崩溃。例如,(int)"text" 无效并且不会编译,但(int)(dynamic)"text" 对编译器来说完全没问题,并且当代码到达那里时会引发异常。在某些情况下需要dynamic,但应仔细考虑。 (添加这个延迟很长的评论主要是为了将来访问此答案的任何人。)
    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2011-09-10
    • 2011-07-11
    • 2011-03-01
    • 2010-09-27
    相关资源
    最近更新 更多