2013-04-30 163 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 
     } 
    }