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

时间:2011-11-29 10:46:31

标签: 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();
    doelse();
    }
    else if(str.compareTo("choiceC")==0){
    dosomeother.somethingforC();
    doblahblah();
    writeblabla();
    }

}

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

但是A,B和C共享很多行(前三行方法)。

如果我为A,B和C生成不同的方法,我将不得不在将来需要维护时更改每个方法,因此我无法通过设计模式方法获得设计代码的帮助。 / p> 你告诉我什么?

感谢您的任何想法。

2 个答案:

答案 0 :(得分:2)

您要找的是polymorphism

有两种“正确的”面向对象的方法可以做你想要的。我个人倾向于第二个,我会告诉你原因。

  • 继承:拥有一个超类(可能是抽象的),其中您的方法可以处理所有常见内容(do.something();do.anotherthing();do.somethingelse();。然后这个方法应该调用另一个abstract方法。然后你定义该类的三个子类,每个子类用于一个不同的选择(“选择A”,“选择B”和“选择C”)。每个子类以不同的方式实现该方法,并做您需要做的事情。

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

我个人更喜欢组合而不是继承,因为它通常会产生一个更易读,更简单,更少错误且很多更易测试的代码(如果你使用的话)按照建议接口,然后你可以在主类的单元测试中模拟它。它还确保了关注点的分离。

答案 1 :(得分:1)

如果您正在复制粘贴代码,那么您做错了;)

如何创建具有方法foo的基本抽象类和抽象方法doTheSomething。然后用A,B和C扩展它,并只实现抽象方法doSomething。

然后你的代码只需要弄清楚基于字符串的开关(在Java7中是一个真正的简单开关,顺便说一下),得到正确的类,并运行foo,这将反过来运行重载的抽象方法doSomething。

很抱歉这是一个很普遍的想法,但是你没有详细说明你对AB和C的行为是否相似,或属于同一个对象等...所以把它作为一种可能性并检查如果它远程适合您的情况! ;)

相关问题