Evitar instanceof al comprobar un tipo de mensaje

Tengo la siguiente situación en la que una clase cliente ejecuta un comportamiento diferente según el tipo de mensaje que recibe. Me pregunto si hay una mejor manera de hacer esto ya que no me gustan la instancia de if y if.

Una cosa que pensé en hacer fue sacar los métodos de la clase cliente y ponerlos en los mensajes. Pondría un método como process () en la interfaz de IMessage y luego pondría el comportamiento específico del mensaje en cada uno de los tipos de mensajes concretos. Esto haría que el cliente sea sencillo porque simplemente llamaría a message.process () en lugar de verificar tipos. Sin embargo, el único problema con esto es que el comportamiento contenido en los condicionales tiene que ver con las operaciones en los datos contenidos dentro de la clase Cliente. Por lo tanto, si implementara un método de proceso en las clases de mensajes concretos, tendría que pasarlo al cliente y no sé si esto también tiene 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
        }
}

Respuestas a la pregunta(5)

Su respuesta a la pregunta