【问题标题】:Class Design issues类设计问题
【发布时间】:2013-04-30 05:58:51
【问题描述】:

目前,我有以下类设计:

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

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

  3. TigerHandler、LionHandler、LeopardHandler 等“有”Tiger、Lion、Leopard 等。

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

除了复制/创建一个新的 CheetahHandler 之外,有没有我可以使用的方法(设计)?比如,可以处理任何这些“HAS A”类(如 Tiger、Lion、Cheetah 等)的 GenericHandler。

【问题讨论】:

    标签: java design-patterns ooad


    【解决方案1】:

    如果您的所有处理程序只提供类型安全,而不做任何其他事情,您可以改用泛型:

    public class AnimalHandler<T extends Animal> {
    
        private T theAnimal;
    
        public T getTheAnimal() {} 
    
        // Etc
    
    }
    

    【讨论】:

      【解决方案2】:

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

      确保所有动物类(老虎、狮子、豹)都扩展了让我们说一个Animal 类。 然后使用:

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

      并在您的代码中使用animal

      当你想实例化一个 Tiger 处理程序时,将其用作:

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

      【讨论】:

      • 我已经按照你提到的(使用泛型)实现了它,我还发现使用通用接口也可以正常工作(没有泛型)。我还有一个问题:如果我在网络环境中使用 AnimalHandler 并且如果我传递了类似“mysite.com/app.do?animal=tiger”的内容,我必须使用 if 条件检查我收到的动物值和创建您提到的相应对象(AnimalHandler tigerHandler = new AnimalHandler();)。所以会有很多if(或if else)条件。有没有办法避免这种情况?
      【解决方案3】:

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

      -- 如果方法接口都一样,只是内部功能不同

      --如果你在 childHandlers 中对 Animalhandler 进行了扩展

      那么,你应该将 AnimalHandler 设为一个抽象类(实现 iAnimalHandler)并使用泛型来处理 Animal(每个 Tiger、Lion、Leopard 的超类)

      【讨论】:

        【解决方案4】:

        正如其他人所指出的,泛型是一种很好的方法,或者您可以使用策略模式:

           class Animalhandler {
              List<Animal> animals;
              // add, remove and do stuff with animals
           }
        
            interface Animal {
                void makeSound();
            }
            class Cat extends Animal {
                public void makeSound() {
                // meow
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2013-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-06
          相关资源
          最近更新 更多