java:避免使用instanceof和+更好的代码设计解决方案

时间:2017-06-20 14:58:47

标签: java oop design-patterns

我需要帮助设计我的代码。 假设我有一个表示字段元数据的界面

public interface FieldDefinition {
   boolean validate(Object value)
   FieldTypeDefinition getFieldTypeDefinition()
}

以及实现此接口的类(我不在这里写所有上下文,例如属性),

public class SomeFieldDefinition implements FieldDefinition {
    @Override
    public boolean validate(Object value) {
        // some general validation logic
    }
    @Override
    public FieldTypeDefinition getFieldTypeDefinition() {
        // return NumericFieldTypeDefinition or StringFieldTypeDefinition
    }
}

public class SomeFieldDefinition2 implements FieldDefinition {
    @Override
    public boolean validate(Object value) {
        // some general validation logic
    }
    @Override
    public FieldTypeDefinition getFieldTypeDefinition() {
        // return NumericFieldTypeDefinition or StringFieldTypeDefinition
    }
}

现在,FieldTypeDefinition也是一个接口

public interface FieldTypeDefinition {
    public String getTypeName();
    boolean validate(FieldDefinition fieldDefinition,Object value);
}

我有实现它的具体类

public class StringFieldTypeDefinition implements FieldTypeDefinition {
    @Override
    public String getTypeName() {
        return "String";
    }
    @Override
    public boolean validate(FieldDefinition fieldDefinition, Object value) {
        // some specific field of type string validations by fieldDefinition type
    }
}
public class NumericFieldTypeDefinition implements FieldTypeDefinition {
    @Override
    public String getTypeName() {
        return "Number";
    }
    @Override
    public boolean validate(FieldDefinition fieldDefinition, Object value) {
        // some specific field of type number validations by fieldDefinition type
    }
}

现在,当我想对字段进行一些验证时,我希望进行一般验证,并通过字段类型进行特定验证。 所以假设我在SomeFieldDefinition2上使用String参数调用方法validate,方法将如下所示:

public boolean validate(Object value) {
    // some general validation logic
    getFieldTypeDefinition().validate(this, value); // getFieldTypeDefinition() returns StringFieldTypeDefinition
}

这导致了一个问题,因为在 StringFieldTypeDefinition 类的验证方法中,我需要检查fieldDefinition参数的实例,并通过其值,制作合适的验证逻辑, 因为在每个FieldDefinition类型类中,我都有不同的逻辑和元数据。

有没有更好的方法来设计我的代码? 我希望我的问题是可以理解的。

0 个答案:

没有答案