Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 课堂设计问题_Java_Design Patterns_Ooad - Fatal编程技术网

Java 课堂设计问题

Java 课堂设计问题,java,design-patterns,ooad,Java,Design Patterns,Ooad,目前,我有以下课程设计: AnimalHandler(所有动物的基类) 虎汉德勒扩展了AnimalHandler,狮汉德勒扩展了AnimalHandler,豹汉德勒扩展了AnimalHandler等等 虎手、狮手、豹手等都有虎、狮、豹等 现在的问题是:TigerHandler、LionHandler、LeopardHandler等都是相同的(它们有相同的方法等),只是它们分别处理Tiger、Lion、Leopard等类。因此,如果我需要一个名为猎豹的新动物群,我只需要复制任何一个(老虎|狮子|豹

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

  • AnimalHandler(所有动物的基类)

  • 虎汉德勒扩展了AnimalHandler,狮汉德勒扩展了AnimalHandler,豹汉德勒扩展了AnimalHandler等等

  • 虎手、狮手、豹手等都有虎、狮、豹等

  • 现在的问题是:TigerHandler、LionHandler、LeopardHandler等都是相同的(它们有相同的方法等),只是它们分别处理Tiger、Lion、Leopard等类。因此,如果我需要一个名为猎豹的新动物群,我只需要复制任何一个(老虎|狮子|豹)处理程序,搜索并替换它的“HAS a”类名,如老虎、狮子、豹

    除了像上面那样复制/创建一个新的猎豹处理器,还有什么方法(设计)可以使用吗?比如说,可以处理这些“有a”类(如老虎、狮子、猎豹等)的通用处理器。

    使用是一种更好的方法

    确保所有动物类(老虎、狮子、豹子)都扩展,比如说
    动物类。
    然后使用:

    public class AnimalHandler<A extends Animal> {
        private A animal;
    }
    
    使用是一种更好的方法

    确保所有动物类(老虎、狮子、豹子)都扩展,比如说
    动物类。
    然后使用:

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

    如果处理程序所做的只是提供类型安全性,而不做其他事情,则可以使用泛型:

    public class AnimalHandler<T extends Animal> {
    
        private T theAnimal;
    
        public T getTheAnimal() {} 
    
        // Etc
    
    }
    
    公共类AnimalHandler{
    私人动物;
    公共T getTheAnimal(){}
    //等
    }
    
    如果处理程序所做的只是提供类型安全,而不做其他事情,则可以使用泛型:

    public class AnimalHandler<T extends Animal> {
    
        private T theAnimal;
    
        public T getTheAnimal() {} 
    
        // Etc
    
    }
    
    公共类AnimalHandler{
    私人动物;
    公共T getTheAnimal(){}
    //等
    }
    
    关于Tiger、Lion和Leopard类在每个处理程序中的使用方式的一些细节

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

    --如果在Animalhandler上有扩展,则您正在ChildHandler中执行


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

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

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

    --如果在Animalhandler上有扩展,则您正在ChildHandler中执行


    然后,您应该使AnimalHandler成为一个抽象类(实现iAnimalHandler),并使用泛型来处理动物(每个老虎、狮子、豹子都有一个超类)

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

       class Animalhandler {
          List<Animal> animals;
          // add, remove and do stuff with animals
       }
    
        interface Animal {
            void makeSound();
        }
        class Cat extends Animal {
            public void makeSound() {
            // meow
            }
        }
    
    类Animalhandler{
    列出动物;
    //添加、删除和处理动物
    }
    界面动物{
    void makeSound();
    }
    猫科动物{
    公共空间{
    //喵喵
    }
    }
    
    正如其他人所指出的,泛型是一种很好的方法,或者您可以使用一种策略模式:

       class Animalhandler {
          List<Animal> animals;
          // add, remove and do stuff with animals
       }
    
        interface Animal {
            void makeSound();
        }
        class Cat extends Animal {
            public void makeSound() {
            // meow
            }
        }
    
    类Animalhandler{
    列出动物;
    //添加、删除和处理动物
    }
    界面动物{
    void makeSound();
    }
    猫科动物{
    公共空间{
    //喵喵
    }
    }
    
    如您所述,我已经实现了它(使用泛型),并且我还发现使用公共接口也可以很好地工作(没有泛型)。我仍然有一个问题:如果我在web上下文中使用AnimalHandler,并且如果我传递了类似“mysite.com/app.do?animal=tiger”的消息,我必须使用If条件检查我收到的动物值,并创建您提到的相应对象(AnimalHandler tigerHandler=new AnimalHandler();)。所以会有很多if(或if-else)条件。还有什么方法可以避免这种情况吗?我已经实现了您提到的(使用泛型),并且我还发现使用公共接口也可以很好地工作(没有泛型)。我仍然有一个问题:如果我在web上下文中使用AnimalHandler,并且如果我传递了类似“mysite.com/app.do?animal=tiger”的消息,我必须使用If条件检查我收到的动物值,并创建您提到的相应对象(AnimalHandler tigerHandler=new AnimalHandler();)。所以会有很多if(或if-else)条件。有没有办法避免这种情况?