padrão de design de despacho?

Suponha que eu tenha uma hierarquia de classes em Java:

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

e eu tenho outra classe no mesmo pacote:

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

onde quero fazer algo diferente para cada tipo de item, mas não quero definir essa ação nos diferentesItem classes (MusicBox, TypeWriter, SoccerBall)

Uma maneira de lidar com isso é:

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

Isso funciona, mas parece realmente desajeitado.Existe uma maneira melhor de fazer isso quando conheço casos especiais? (obviamente seItem contém um métododoSomethingSpecial então eu posso chamar o método desse item sem me importar com o tipo, mas se eu não quero que essa diferenciação ocorra no próprio item, como eu lido com ele?)

questionAnswers(4)

yourAnswerToTheQuestion