2010-03-17 17 views
7

¿Cuál es el patrón de "despachador" y cómo lo implementaría en el código?¿Qué es el patrón de diseño "Dispatcher"?

Tengo una bolsa de propiedades de objetos genéricos y me gustaría que la recuperación se delegue en un método genérico.

Actualmente, tengo propiedades que buscan una clave específica en la bolsa. Por ejemplo:

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

Se sugirió que esto podría ser más genérico con el patrón "despachador", pero no he podido encontrar una buena descripción o ejemplo.

Estoy buscando una forma más genérica para manejar la propiedad bag store/retrieve.

Respuesta

8

No estoy seguro de entender bien su pregunta, pero ...

Tengo una bolsa de propiedades de objetos genéricos y me gustaría tener la recuperación delegada a un método genérico.

... parece que está buscando información sobre "doble despacho"?

Imagine que tiene tres clases:

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

Y dos métodos para hacer algo con los objetos de tipo B y C:

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

El problema es que cuando todo lo que tienes es una variable de un tipo estático ...:

A a = new B(); 

... no se puede llamar HacerAlgo (a) porque solamente en tiempo de compilación su tipo estático (A) es conocido, por lo que el compilador no puede decidir si debe llamar al método DoSomething (B obj) o DoSomething (C obj).

Aquí es donde entra el doble despacho. Algunos idiomas lo admiten de fábrica, otros como C++, C# y Java no. Pero puede implementarlo usted mismo en estos idiomas también. Para ver un ejemplo:

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

Y:

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

+1

Los primer artículo de Wikipedia en C#, envío múltiple se pueden lograr sin emplear el patrón de visitante. Esto se hace simplemente lanzando el objeto que se pasa a dinámico –