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
Design patterns 在这种情况下,如何做出优雅的设计?_Design Patterns - Fatal编程技术网

Design patterns 在这种情况下,如何做出优雅的设计?

Design patterns 在这种情况下,如何做出优雅的设计?,design-patterns,Design Patterns,我有这样一种方法: public void foo(String str){ do.something(); do.anotherthing(); do.somethingelse(); if(str.compareTo("choiceA")==0){ do.somethingforA(); } else if(str.compareTo("choiceB")==0){ doanother.somethingforB();

我有这样一种方法:

   public void foo(String str){

    do.something();
    do.anotherthing();
    do.somethingelse();

    if(str.compareTo("choiceA")==0){
    do.somethingforA();
    }
    else if(str.compareTo("choiceB")==0){
    doanother.somethingforB();
    doelse();
    }
    else if(str.compareTo("choiceC")==0){
    dosomeother.somethingforC();
    doblahblah();
    writeblabla();
    }

}
我想将代码设计为为为A、B和C定义不同的类或方法

但是有很多行(方法的前三行)是A、B和C共享的

如果我为A、B和C生成不同的方法,我将不得不在将来需要维护时更改每个方法,因此我将无法获得使用设计模式方法设计代码的帮助

你有什么建议


谢谢你的建议。

如果你复制粘贴代码,那你就错了;)

创建一个具有方法foo的基本抽象类,并创建一个抽象方法来完成某些事情,怎么样。然后用A、B和C对其进行扩展,只实现抽象方法doSomething

然后,您的代码只需要找出基于字符串的开关(在Java7中是一个真正简单的开关),获得正确的类,然后运行foo,这将反过来运行重载的抽象方法doSomething


很抱歉,这是一个一般性的想法,但您没有提供很多关于您对a B和C的操作是否相似,或者是否属于同一对象等的详细信息。。。所以,把它作为一种可能性,并检查它是否与您的情况完全相符!;)

您需要的是
多态性

有两种“合适的”面向对象的方法来做你想做的事情。我个人喜欢第二个,我会告诉你原因

  • 继承:拥有一个超类(可能是抽象类),在该超类中,您的方法执行所有常见操作(
    do.something();
    do.anotherthing();
    do.somethingelse());
    。然后此方法应调用另一个
    抽象
    方法。然后定义该类的三个子类,每个子类用于不同的选择(“选择A”、“选择B”和“选择C”)。每个子类以不同的方式实现该方法,并执行您需要执行的操作

  • Composition:将一个接口注入包含方法
    foo
    的对象,而不是子类。该接口有三种不同的实现,一种用于“选择A”,一种用于“选择B”,另一种用于“选择C”


就我个人而言,我更喜欢组合而不是继承,因为它通常会生成可读性更高、更不复杂、错误更少、更易于测试的代码(如果按照建议使用接口,那么可以在主类的单元测试中模拟它)。它还确保了关注点的分离。

谢谢你的回答,但我想问一下,如果我生成了一个抽象方法,我必须在每个实现中复制并粘贴前三行,并且在维护时必须更改所有实现。这就是问题所在,共享前三行。好的,我需要更好的语法来解释这一点,我是editi举例说明答案