2010-03-17 94 views
7

什么是“调度程序”模式,以及如何在代码中实现它?什么是“调度员”设计模式?

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

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

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

有人提出,这可能是与“调度”模式更通用的,但我一直无法找到一个很好的说明或示例。

我正在寻找更通用的方式来处理物业包存储/检索。

回答

8

我不知道我正确理解你的问题,但是...

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

...听起来你正在寻找关于“双重调度”的信息吗?

想象一下,你有三类:

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

和两个方法做B型的对象和C的东西:

void DoSomething(B obj) {} 
void DoSomething(C obj) {} 

的问题是,当你已经是一个变量静态Ⅰ型:

A a = new B(); 

...你不能调用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

+1

第一个维基百科的文章各国在C#中,多分派可以不使用访问者模式来实现。这是通过简单地将传递的对象转换为动态的' – 2016-07-13 09:21:37