шаблон проектирования диспетчеризации?

Предположим, у меня есть иерархия классов в Java:

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

и у меня есть еще один класс в том же пакете:

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

, где я хочу сделать что-то свое для каждого типа элемента, но я не хотите определить это действие в различных классах Item ( MusicBox , TypeWriter , SoccerBall ).

Один из способов справиться с этим is:

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

Это работает, но кажется действительно неуклюжим. Есть ли лучший способ сделать это, если мне известны особые случаи? (очевидно, если Элемент содержит метод doSomethingSpecial , то я могу просто вызвать метод этого элемента не заботясь о том, что это за тип, но если я не буду Я не хочу, чтобы эта дифференциация происходила внутри самого элемента, как мне с этим справиться?)

5
задан Jason S 8 September 2010 в 21:56
поделиться