У меня есть GOF, сидящий на моем столе здесь, и я знаю, что должен быть какой-то шаблон дизайна, который решает проблему, которую я имею, но человек, которого я не могу понять.
Для упрощения я изменил имя некоторых интерфейсов, которые я использую.
Итак, вот проблема, с одной стороны провода, у меня есть несколько серверов, которые отправляют разные типы сообщений. С другой стороны провода у меня есть клиент, который должен иметь возможность обрабатывать все типы сообщений.
Все сообщения реализуют один и тот же общий интерфейс IMessage. Моя проблема в том, что когда клиент получает новый IMessage, как он узнает, какой тип сообщений был получен?
Я предположил, что могу сделать что-то вроде следующего, но это просто ЧУВСТВИТЕЛЬНО ужасно.
TradeMessage tMessage = newMessage as TradeMessage;
if (tMessage != null)
{
ProcessTradeMessage(tMessage);
}
OrderMessage oMessage = newMessage as OrderMessage;
if (oMessage != null)
{
ProcessOrderMessage(oMessage);
}
Вторая мысль заключается в том, чтобы добавить свойство к IMessage, называемому MessageTypeID, но это потребует, чтобы я написал что-то вроде следующего, которое также ЧУВСТВИТЕЛЬНО ужасно.
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);
}
Я знаю, что эта общая проблема решена в миллион раз, поэтому должен быть более эффективный способ решения проблемы использования метода, который использует интерфейс как параметр, но нуждается в различном управлении потоком, основанном на том, что класс реализовал этот интерфейс.