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



我想重构一个几乎有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
}

我考虑过使用继承并将其分解为函数,这些函数在必要时会被覆盖,但这对我来说很混乱。有适合这种用例的模式吗?顺便说一句,任何关于重构遗留代码的建议都是非常受欢迎的。

你说得很对。如您所描述的重构称为用多态性替换条件性。此外,您还可以查看责任链、指挥或战略设计模式。

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

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;
             }
        }
    }
}

如果您有很多段,那么列表列表可以包含作为出口处理程序的公共代码,并包含所有逻辑。您将逻辑委托给实现类,并缩短类中的实际代码。然而,就效率而言,您将同时杀死指令和数据缓存。如果这不是你想要的,那么很可能是:责任链模式-维基百科

最新更新