patrón de diseño de envío?

Supongamos que tengo una jerarquía de clases en Java:

interface Item { ... };
class MusicBox implements Item { ... };
class TypeWriter implements Item { ... };
class SoccerBall implements Item { ... };

y tengo otra clase en el mismo paquete:

class SpecialItemProcessor {
    public void add(Item item)
    {
        /* X */
    }
}

donde quiero hacer algo diferente para cada tipo de elemento, pero no quiero definir esa acción en los diferentesItem clases (MusicBox, TypeWriter, SoccerBall)

Una forma de manejar esto es:

class SpecialItemProcessor {
    public void add(Item item)
    {
        if (item instanceof MusicBox)
        {
            MusicBox musicbox = (MusicBox)item;
            ... do something ...
        }
        else if (item instanceof MusicBox)
        {
            TypeWriter typewriter = (TypeWriter)item;
            ... do something ...
        }
        else if (item instanceof SoccerBall)
        {
            SoccerBall soccerball = (SoccerBall)item;
            ... do something ...
        }
        else
        {
            ... do something by default ...
        }
    }
}

Esto funciona pero parece realmente torpe.¿Hay una mejor manera de hacer esto, cuando conozco casos especiales? (obviamente siItem contiene un métododoSomethingSpecial entonces puedo llamar al método de ese elemento sin importar de qué tipo sea, pero si no quiero que esa diferenciación ocurra dentro del elemento en sí, ¿cómo lo trato?)

Respuestas a la pregunta(4)

Su respuesta a la pregunta