Evitando instância de quando verificar um tipo de mensagem

Eu tenho a seguinte situação em que uma classe de cliente executa um comportamento diferente com base no tipo de mensagem que recebe. Eu estou querendo saber se existe uma maneira melhor de fazer isso desde que eu não gosto do instanceof e as instruções if.

Uma coisa que pensei em fazer era retirar os métodos da classe cliente e colocá-los nas mensagens. Eu colocaria um método como process () na interface IMessage e colocaria o comportamento específico da mensagem em cada um dos tipos de mensagem concretos. Isso tornaria o cliente simples, porque apenas chamaria message.process () em vez de tipos de verificação. No entanto, o único problema com isso é que o comportamento contido nas condicionais tem a ver com operações em dados contidos na classe Client. Assim, se eu implementasse um método de processo nas classes de mensagens concretas, teria que passar para o cliente e também não sei se isso realmente faz sentido.

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

questionAnswers(5)

yourAnswerToTheQuestion