对于具有分支逻辑的类似对象,什么是一个好的java设计模式

时间:2016-05-08 09:30:13

标签: java design-patterns legacy-code

我想重构一个近5000行的现有类,但是我对构造函数有困难。现在,它类似于以下内容(这里的方法实际上是10-30个代码块)

public MyClass( MyObject o ) {
  if ( o.name.equalsIgnoreCase("a") ) {
    doSomething()
   } else  {
     doSomethingElse() 
   }
   commonCode()
   if (o.name.equalsIgnoreCase("a") ) {
     doSecondThing()
   } else {
     doOtherSecondThing() //almost identical to doSecondThing but with some extra steps that absolutely have to be done in this sequence
  }
 // more of the same

}

我考虑过使用继承并将其分解为必要时会被覆盖的函数,但这对我来说感觉很麻烦。是否有适合此用例的模式?顺便提一下,任何关于重构遗留代码的建议都会受到欢迎。

2 个答案:

答案 0 :(得分:2)

你是完全正确的。像你描述的重构被称为 Replace Conditional with Polymorphism。 您还可以查看Chain-of-responsibilityCommandStrategy设计模式。

答案 1 :(得分:1)

如果每个对象都遵循以下模式:

if(conditionA)
    DoA();
else
    DoElse();
Common();
if(conditionA2)
    DoA2();
else if(conditionB2)
    DoB2();
else
    DoElse2();
Common2();

我建议你有一个共同的课程,收集有条件的处理程序。这大致是我的意思(伪代码不是java):

public interface IConditionalHandler 
{
    bool Condition();
    void Action();
}
public class ActionHandler
{
    private List<IConditionalHandler> m_FirstHandlers;
    private List<IConditionalHandler> m_SecondHandlers; //Or possibly use a list of lists
    public ActionHandler()
    {
        m_FirstHandlers = new ArrayList<>();
        m_FirstHandlers.add(new HandlerA1());
        m_FirstHandlers.add(new HandlerB1());
        m_SecondHandlers = new ArrayList<>();
        m_SecondHandlers.add(new HandlerA1());
        m_SecondHandlers.add(new HandlerB1());
    }
    void DoStuff()
    {
        for(IConditionHandler handler : m_FirstHandlers)
        {
             if(handler.Condition())
             {
                 handler.Action();
                 break;
             }
        }
        CommonA();
        for(IConditionHandler handler : m_SecondHandlers)
        {
             if(handler.Condition())
             {
                 handler.Action();
                 break;
             }
        }
    }
}

如果你有很多段,列表列表可以包含你的公共代码作为退出处理程序并包含所有逻辑。您将逻辑委托给实现类,并缩短类中的实际代码。 但是,就效率而言,你将杀死指令和数据缓存。如果这不是你想要的,那么很可能是:Chain-of-Responsibility Pattern - Wikipedia