我有这样的方法:
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> 你告诉我什么?
感谢您的任何想法。
答案 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的行为是否相似,或属于同一个对象等...所以把它作为一种可能性并检查如果它远程适合您的情况! ;)