Tengo el GOF sentado en mi escritorio aquí y sé que debe haber algún tipo de patrón de diseño que resuelva el problema que tengo, pero no puedo entenderlo .Patrón de diseño para manejar múltiples tipos de mensajes
Por razones de simplicidad, he cambiado el nombre de algunas de las interfaces que estoy usando.
Así que aquí está el problema, en un lado del cable, tengo varios servidores que envían diferentes tipos de mensajes. En el otro lado del cable, tengo un cliente que necesita poder manejar todos los diferentes tipos de mensajes.
Todos los mensajes implementan la misma interfaz común IMessage. Mi problema es que cuando el cliente recibe un nuevo IMessage, ¿cómo sabe qué tipo de IMessage recibió?
Supuse que podría hacer algo como lo siguiente, pero esto simplemente se siente horrible.
TradeMessage tMessage = newMessage as TradeMessage;
if (tMessage != null)
{
ProcessTradeMessage(tMessage);
}
OrderMessage oMessage = newMessage as OrderMessage;
if (oMessage != null)
{
ProcessOrderMessage(oMessage);
}
El segundo pensamiento, es añadir una propiedad a iMessage llama MessageTypeID, pero eso requeriría mí escribir algo como lo siguiente, que también se siente muy mal.
TradeMessage tMessage = new TradeMessage();
if (newMessage.MessageTypeID == tMessage.MessageTypeID)
{
tMessage = newMessage as TradeMessage;
ProcessTradeMessage(tMessage);
}
OrderMessage oMessage = new OrderMessage();
if (newMessage.MessageTypeID == oMessage.MessageTypeID)
{
oMessage = newMessage as OrderMessage;
ProcessOrderMessage(oMessage);
}
Sé que este problema general se ha abordado un millón de veces, por lo que no tiene que haber una manera mejor de resolver el problema de tener un método que toma una interfaz como parámetro, pero necesita diferentes de control de flujo basado en qué clase ha implementado esa interfaz.
añadí una una respuesta similar a la que usted aceptó que funciona a partir de la sugerencia de @Brian Gideon, que creo que encontrará que funciona bien con Double Dispatching. – SwDevMan81