类设计问题

时间:2013-04-30 05:58:51

标签: java design-patterns ooad

目前,我有以下课程设计:

  1. AnimalHandler(所有动物的基类)

  2. TigerHandler扩展了AnimalHandler,LionHandler扩展了AnimalHandler,LeopardHandler扩展了AnimalHandler等等。

  3. TigerHandler,LionHandler,LeopardHandler等“HAS A”Tiger,Lion,Leopard等。

  4. 现在的问题是:TigerHandler,LionHandler,LeopardHandler等都是一样的(它们有相同的方法等),除了它们分别处理Tiger,Lion,Leopard等类。因此,如果我需要一个名为Cheetah的新动物组,我只需复制任何(Tiger | Lion | Leopard)处理程序,并搜索并替换其“HAS A”类名称,如Tiger,Lion,Leopard。

    不是像上面那样复制/创建一个新的CheetahHandler,有没有一种方法(设计)可以使用?比方说,GenericHandler可以处理任何这些“HAS A”类(如Tiger,Lion,Cheetah等)。

4 个答案:

答案 0 :(得分:4)

如果您的所有处理程序都提供了类型安全性,并且不执行任何其他操作,则可以使用泛型来代替:

public class AnimalHandler<T extends Animal> {

    private T theAnimal;

    public T getTheAnimal() {} 

    // Etc

}

答案 1 :(得分:2)

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

确保所有动物类(Tiger,Lion,Leopard)扩展,让我们说Animal课程。 然后使用:

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

在代码中使用animal

如果要实例化老虎处理程序,请将其用作:

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

答案 2 :(得分:0)

关于如何在每个处理程序中使用Tiger,Lion,Leopard类的一些细节

- 如果方法接口完全相同,只有内部功能不同

- 如果Animalhandler上有扩展,那么你在childHandlers内部进行了

然后,你应该让AnimalHandler成为一个抽象类(实现iAnimalHandler)并使用泛型来处理Animal(每个Tiger,Lion,Leopard的超级类)

答案 3 :(得分: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
        }
    }