Я всегда склонен сталкиваться со следующей проблемой проектирования, которую я никогда не знаю, как лучше решить. Обычно это начинается с иерархии животных в моем цирке:
Animal
Cat
BigCat
Dog
Elephant
...
Теперь, каждое животное должно быть обучено, так что для каждого есть отдельный метод:
public interface Trainer {
void train( BigCat animal );
void train( Dog animal );
void train( Elephant animal );
// ...
}
Проблема в том, что CircusDirector наплевать. Он просто бросает животных тренеру, даже не глядя.
public class CircusDirector {
public void work() {
Trainer trainer = getTrainer();
Animal animal = getAnimal();
// ...and he doesn't know a frog from a pony,
// so he tries to just:
trainer.train(animal);
}
}
Теперь тренер может получить дополнительный метод, такой как
void train( Animal animal );
, где он будет использовать instanceof
, чтобы отправить животное подходящим способом, но это кажется уродливым и не рекомендуется. Есть ли лучшее решение с использованием дженериков?