我總是傾向於遇到以下設計問題,我從來不確定如何最好地解決問題。它通常與動物的層次開始於我的馬戲團:有關動態子類層次結構處理設計的問題
Animal
Cat
BigCat
Dog
Elephant
...
現在,每個動物需要接受培訓,以便有針對每一個單獨的方法:
public interface Trainer {
void train(BigCat animal);
void train(Dog animal);
void train(Elephant animal);
// ...
}
的問題是,馬戲團導演不給一個該死的。他只是把動物扔給訓練師,甚至沒有看。現在
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 2010-05-17 19:09:11
@Jake:不幸的是,是的,但作爲樣板,它是相當小的。 – GaryF 2010-05-17 19:27:09
@Jake:特定動物的方法不能成爲培訓師的一部分 - 破壞基本的封裝。特定動物的訓練方法必須是動物的一部分,而不是訓練師。所以每隻動物必須提供特定訓練方法。 acceptTrainer是在Director,Trainer和每個Animal實例之間形成API的一種方法。 – 2010-05-17 19:45:12