每个类包含约30个方法,其中几乎一半是相同或非常相似。很快我要添加一个与这两个班级处于相同状况的第三班。我觉得维护或改变它是一团糟。我如何重构以避免重复的代码?如何用许多类似的方法重构两个复杂的类?
下面是一个简化版本:
public class A extends ContentPanel{
private AMenuProvider menuProvider;
private ADefinitionTree tree;
public void sameMethod1(){
...
menuProvider.do();
tree.doSomething();
...
}
public void sameMethod2(){
...
menuProvider.do();
tree.doSomething();
...
}
public void differentMethodFromA(){
... // uses menuProvider and tree
}
...
// 10 similar methods and 20 different methods
}
public class B extends ContentPanel{
private BMenuProvider menuProvider;
private BDefinitionTree tree;
public void sameMethod1(){
...
menuProvider.do();
tree.doSomething();
...
}
public void sameMethod2(){
...
menuProvider.do();
tree.doSomething();
...
}
public void differentMethodFromB(){
... // uses menuProvider and tree
}
...
// 10 similar methods and 20 different methods
}
注:BMenuProvider VS AMenuProvider和ADefinitionTree VS BDefinitionTree可能是非常不同的实现,但它们提供了许多相同的方法。他们每个人都有一些独特的方法,而另一个没有。
我想过创建一个抽象类并对其进行扩展,但无论在哪里放置menuProvider和树属性,它都显得很丑陋。我不确定是否有任何设计模式或解决方案。请帮助我重构类,以便我可以删除重复的代码。
如果功能相同为什么*不会*基类是一个合理的解决方案? –
@DaveNewton因为剩下的20个不同的方法,如不同的MethodFromA和differentMethodFromB也需要使用字段menuProvider和树,我必须从基类中提供getter方法。每次我召唤一个来自基地的吸气者时,我也必须施展一次,这在我看来很丑陋。 – Alex
然后应该有一个接口来规范'MenuProvider'的功能。 –