对于具有分支逻辑的类似对象,什么是好的 java 设计模式
What is a good java design pattern for similar objects with branching logic
我想重构现有的 class 将近 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
}
我考虑过使用继承并将事物分解成函数,在必要时可以覆盖这些函数,但这对我来说感觉很乱。是否有适合此用例的模式?顺便提一下,我们非常欢迎任何有关重构遗留代码的建议。
你完全正确。像你描述的那样重构被称为
Replace Conditional with Polymorphism。
您也可以查看 Chain-of-responsibility, Command or Strategy 设计模式。
如果每个对象都遵循以下模式:
if(conditionA)
DoA();
else
DoElse();
Common();
if(conditionA2)
DoA2();
else if(conditionB2)
DoB2();
else
DoElse2();
Common2();
我建议你有一个通用的 class 来收集有条件的处理程序。这大概就是我的意思(伪代码不是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;
}
}
}
}
如果您有很多段,列表的列表可以包含您的通用代码作为退出处理程序并包含所有逻辑。您将逻辑委托给实现 classes,并缩短 class 中的实际代码。
但是,就效率而言,您将同时杀死指令和数据缓存。如果这不是您要查找的内容,那么很可能是:Chain-of-Responsibility Pattern - Wikipedia
我想重构现有的 class 将近 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
}
我考虑过使用继承并将事物分解成函数,在必要时可以覆盖这些函数,但这对我来说感觉很乱。是否有适合此用例的模式?顺便提一下,我们非常欢迎任何有关重构遗留代码的建议。
你完全正确。像你描述的那样重构被称为 Replace Conditional with Polymorphism。 您也可以查看 Chain-of-responsibility, Command or Strategy 设计模式。
如果每个对象都遵循以下模式:
if(conditionA)
DoA();
else
DoElse();
Common();
if(conditionA2)
DoA2();
else if(conditionB2)
DoB2();
else
DoElse2();
Common2();
我建议你有一个通用的 class 来收集有条件的处理程序。这大概就是我的意思(伪代码不是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;
}
}
}
}
如果您有很多段,列表的列表可以包含您的通用代码作为退出处理程序并包含所有逻辑。您将逻辑委托给实现 classes,并缩短 class 中的实际代码。 但是,就效率而言,您将同时杀死指令和数据缓存。如果这不是您要查找的内容,那么很可能是:Chain-of-Responsibility Pattern - Wikipedia