Избегание использования instanceof

Я борюсь с тем, как избежать использования instanceof() в некоторых частях моего кода. Этот надуманный пример в какой-то степени отражает проблему.

Class Meat extends Food;

Class Plant extends Food;

Class Animal;

Class Herbivore extends Animal
{
    void eat( Plant food);
}

Class Carnivore extends Animal
{
    void eat( Meat food);
}

Class Omnivore extends Animal
{
    void eat(Food food);
}

Class Zoo
{
    List<Animals> animals;

    void receiveFood( Food food)
    {
        // only feed Plants to Herbivores and Meat to Carnivores
        // feed either to Omnivores
    }
}

Травоядных интересуют только растения, плотоядных — только мясо, а всеядных — и то, и другое. Когда зоопарк получает еду, имеет смысл пытаться кормить едой только тех животных, которые едят этот тип пищи.

Я думал о нескольких решениях, но все они, похоже, зависят от использования instanceof()где-то, и мои различные рефакторинги, кажется, просто перемещают его.

(1) Я мог бы реализовать eat( Food food)в Animal, и каждый подкласс мог бы игнорировать пищу, которую он не ест, но это неэффективно и потребовало бы, чтобы каждый подкласс Animal использовал instanceof()для проверки типа еды.

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

Я думал о некоторых других подходах, но, опять же, они, кажется, просто переходят на instanceof()доллар.

Есть предложения? Или это (по крайней мере 2) будет приемлемым использованием instanceof()?

10
задан HolySamosa 4 April 2012 в 19:11
поделиться