2013-04-30 169 views
0

目前,我有下面的類設計:類設計問題

  1. AnimalHandler(對所有動物的基類)

  2. TigerHandler延伸AnimalHandler,LionHandler延伸AnimalHandler,LeopardHandler延伸AnimalHandler等。

  3. TigerHandler,LionHandler,LeopardHandler等等有「Tiger」,「Lion」,「Leopard」等等。

現在的問題是:TigerHandler,LionHandler,LeopardHandler等都是相同的(它們有相同的方法,等等),不同的是它們分別班對付虎,獅,豹等。因此,如果我需要一個名爲Cheetah的新動物組,我只需要複製(Tiger | Lion | Leopard)Handler中的任何一個,並搜索並替換Tiger,Lion,Leopard等「HAS A」類名稱。

而不是像上面那樣複製/創建一個新的CheetahHandler,有沒有一種方法(設計),我可以使用?例如,可以處理任何這些「HAS」類(如Tiger,Lion,Cheetah等)的GenericHandler。

回答

2

使用generics是一個更好的方法。

確保所有動物類(老虎,獅子,豹)延伸讓我們說一個Animal類。 然後使用:

public class AnimalHandler<A extends Animal> { 
    private A animal; 
} 

並使用animal你的代碼中。

當你想實例化一個老虎的處理程序,使用它作爲:

AnimalHandler<Tiger> tigerHandler = new AnimalHandler<>(); 
+0

我已經實現了它,你提到的(使用泛型),我也發現你唱一個共同的界面也很好(沒有泛型)。我仍然有一個問題:如果我在Web上下文中使用AnimalHandler,並且如果我傳遞諸如「mysite.com/app.do?animal=tiger」之類的東西,則必須使用if條件來檢查我收到的動物值,以及像你提到的那樣創建相應的對象(** AnimalHandler tigerHandler = new AnimalHandler <>(); **)。所以會有很多if(或其他)條件。有沒有辦法避免這種情況? – 2013-05-11 09:28:46

4

如果所有的處理程序做的是提供類型安全,並沒有別的,你可以使用泛型代替:

public class AnimalHandler<T extends Animal> { 

    private T theAnimal; 

    public T getTheAnimal() {} 

    // Etc 

} 
0

有關Tiger,Lion,Leopard類在每個處理器中的使用方式的詳細信息

- 如果方法接口全部相同,並且只有內部功能是不同的

- 如果有擴展上Animalhandler你正在做childHandlers內

然後,那麼你應該做AnimalHandler一個抽象類(實現iAnimalHandler),並使用泛型來處理動物(超級類每個老虎,獅子,豹)

0

正如其他人指出,仿製藥是一個很好的辦法,或者你可以使用一個策略模式:

class Animalhandler { 
     List<Animal> animals; 
     // add, remove and do stuff with animals 
    } 

    interface Animal { 
     void makeSound(); 
    } 
    class Cat extends Animal { 
     public void makeSound() { 
     // meow 
     } 
    }