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:将一个接口注入包含方法
的对象,而不是子类。该接口有三种不同的实现,一种用于“选择A”,一种用于“选择B”,另一种用于“选择C”foo
就我个人而言,我更喜欢组合而不是继承,因为它通常会生成可读性更高、更不复杂、错误更少、更易于测试的代码(如果按照建议使用接口,那么可以在主类的单元测试中模拟它)。它还确保了关注点的分离。谢谢你的回答,但我想问一下,如果我生成了一个抽象方法,我必须在每个实现中复制并粘贴前三行,并且在维护时必须更改所有实现。这就是问题所在,共享前三行。好的,我需要更好的语法来解释这一点,我是editi举例说明答案