У меня есть следующая ситуация, когда клиентский класс выполняет различное поведение в зависимости от типа сообщения, которое он получает. Мне интересно, есть ли лучший способ сделать это, поскольку мне не нравятся операторы 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
}
}