Как избежать instanceof при проверке типа сообщения
У меня следующая ситуация, когда клиентский класс выполняет другое поведение в зависимости от типа получаемого сообщения. Мне интересно, есть ли лучший способ сделать это, так как мне не нравятся instanceof и операторы if.
Одна вещь, о которой я подумал, это вытащить методы из клиентского класса и поместить их в сообщения. Я бы поместил метод, подобный process (), в интерфейс IMessage, а затем поместил поведение, специфичное для сообщения, в каждый из конкретных типов сообщений. Это сделает клиент простым, потому что он просто вызовет message.process (), а не проверяет типы. Однако единственная проблема заключается в том, что поведение, содержащееся в условных выражениях, связано с операциями с данными, содержащимися в классе Client. Таким образом, если бы я реализовал метод процесса в конкретных классах сообщений, мне пришлось бы передать его клиенту, и я не знаю, действительно ли это имеет смысл.
public class Client {
messageReceived(IMessage message) {
if(message instanceof concreteMessageA) {
concreteMessageA msg = (concreteMessageA)message;
//do concreteMessageA operations
}
}
if (message instanceof concreteMessageB) {
concreteMessageb msg = (concreteMessageB)message;
//do concreteMessageB operations
}
}