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?)