java - 可能的设计模式而不是 instanceof?

标签 java design-patterns

我正在编写一个对象转换类,用于将域层对象转换为 UI 对象,反之亦然。问题是我的 UI 对象被组织成层次结构,因此我的对象转换类包含“instanceof”语句。这里有明显的代码味道,但我不确定解决方案是什么。

所以我的 UI 层次结构包含一个 RuleDTO,如下所示:

public class RuleDTO {
    protected long ruleID;
    protected long rowID;   
    protected AttributeDTO leftCondition;
    protected AttributeDTO rightCondition;
    protected OperationTypeDTO operationType; 
    protected boolean isActive;     
    // etc...
}

然后我的 RuleDTO 可以被 AssignmentRuleDTO 子类化,如下所示:

public class AssignmentRuleDTO extends RuleDTO {
    protected String assignedToTeam;
    protected String assignmentOperator;        
    // etc...
}

RuleDTO 也可以被 EvaluationRuleDTO 子类化:

public class EvaluationRuleDTO extends RuleDTO {
    protected String successAction;
    protected String failureAction;
    // etc...
}

问题出现在我的 ObjectConversionHelper 类中,它包含以下类型的逻辑:

{
    // Perform logic common to RuleDTO such as setting ruleID, isActive etc
    if(ruleDTO instanceof AssignmentRuleDTO) {
        // Set assignedToTeam and assignmentOperator etc
    }
    else if (ruleDTO instanceOf EvaluationRuleDTO) {
        // Set successAction and failureAction etc  
    }
}

这里有什么好的解决方案呢?我读过有关访问者模式的信息,但不确定它在这里如何应用。

谢谢

最佳答案

您的 RuleDTO 类应该有一个名为 setStuff() 或类似的方法。

然后您在 AssignmentRuleDTOEvaluationRuleDTO 中覆盖它以设置相关字段。

这样你的 ObjectConversionHelper 就可以调用

ruleDTO.setStuff();

关于java - 可能的设计模式而不是 instanceof?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11549706/

相关文章:

java - 用于 Web 服务开发的 Sun Metro 和 Apache CXF 之间的比较?

java - 如何创建一个从 ArrayList 的一行到另一行拆分每一行的循环?

java - Scala:需要 "explicit return"吗?

design-patterns - 带内存的状态模式

wpf - ViewModel 应该在 MVVM 模式中引用哪些类型的对象?

java - 删除作为策略模式一部分的条件代码

java - 什么决定了重写方法的调用

java - Twistd - Telnet - Python 服务器,Java 客户端,客户端在连接关闭之前永远不会接收字符串,此时所有字符串连接在一起并一起发送

java - 在条件值列表中选择一组的最佳设计模式可能会有所不同?

java - 静态方法继承