Что такое шаблон проектирования «Диспетчер»? - PullRequest
8 голосов
/ 17 марта 2010

Что такое шаблон «диспетчер» и как я могу реализовать его в коде?

У меня есть сумка свойств универсальных объектов, и я хотел бы, чтобы поиск был делегирован универсальному методу.

В настоящее время у меня есть свойства, которые ищут определенный ключ в сумке. Например:

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 Ответ

9 голосов
/ 17 марта 2010

Я не уверен, что правильно понял ваш вопрос, но ...

У меня есть сумка свойств универсальных объектов, и я хотел бы, чтобы поиск был делегирован универсальному методу.

... звучит так, будто вы ищете информацию о "двойной диспетчеризации"?

Представьте, что у вас есть три класса:

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

...