Я отредактировал свой предыдущий ответ.Я думал о чем-то намного лучше.Посмотрите редакцию этого поста, если вам интересно.
Воспользуйтесь шаблоном спецификации.Это очень хорошо подходит здесь - гораздо больше, чем декоратор.Вы попросили «проверить», если животное было рогатым.Шаблон декоратора обеспечивает прозрачность, в то время как в этой ситуации вы, похоже, просите о различении.
Шаблон спецификации содержит знания о том, как оценивать некоторые критерии.В нашем случае мы бы хотели что-то вроде:
public interface Specification {
public boolean isSatisfiedBy(Animal aCriteria);
}
public class HornedAnimalSpecification implements Specification {
@Override
public boolean isSatisfiedBy(Animal aCriteria) {
//Right here is where the heart of your problem
//can be solved.
//
//Reserved conquering grounds.
}
}
Теперь вы можете определять свою иерархию животных так, как хотите.Единственное, что вам теперь нужно сделать, это выяснить , что делает животное рогатым.Ваш ответ на этот вопрос входит в класс спецификаций.Тогда ваша основная функция проста как пирог.
public class Zoo {
public static void main(String[] args) {
Animal ram = getHornedAnimal(); //Instantiate however you'd like.
Specification specification = new HornedAnimalSpecification();
if (specification.isSatisfiedBy(ram)) {
//Bingo, it's horned.
} else {
//Not horned!
}
}
}