Я всегда сталкиваюсь с следующей проблемой проектирования, что я никогда не уверен, как наилучшим образом решить проблему. Она обычно начинается с иерархией животных в моем цирке:Вопрос о конструкции управления иерархией динамического подкласса
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
отправить животное в соответствующий метод, но это, кажется, некрасиво и не приходят рекомендуется. Есть ли лучшее решение с использованием дженериков?
Означает ли это, что каждый подкласс должен продолжать повторять метод acceptTrainer()? – Jake
@ Jake: К сожалению, да, но, поскольку шаблонный шаблон идет, он довольно минимален. – GaryF
@ Jake: методы, специфические для животных, не могут быть частью Тренера - это разрушает базовую инкапсуляцию. Методы обучения, связанные с животными, должны быть частью Animal, а не Trainer. Поэтому каждое Животное должно предоставить специальные методы обучения. acceptTrainer - это один из способов формирования API между директором, тренером и каждым экземпляром Animal. –