8

我想在将域对象传递给系统的其他部分之前验证它们。我要验证的所有对象共享相同的接口。问题是我无法弄清楚如何以一种好的方式编写它。我不想在我的值对象中移动验证。但我也不想被迫进行 instanceOf-check。

一个例子:

public interface Vehicle {}

public class Car implements Vehicle {}

public class MotorBike implements Vehicle {}

public interface VehicleValidator {
    void validate();

}

public class CarValidator implements VehicleValidator {

    @Override
    public void validate() {}
}

public class MotorBikeValidator implements VehicleValidator {

    @Override
    public void validate() {}
}

public void process(Vehicle vehicle) {
    //TODO: validate vehicle
    doSomething(vehicle);
}

在 Scala 中,我会做类似于http://debasishg.blogspot.se/2010/06/scala-implicits-type-classes-here-i.html 但这些语言结构在 Java 中是不可能的。

4

3 回答 3

2

这是Double Dispatch设计模式的经典案例。

您需要在车辆中添加一点点回调代码,该代码将在运行时动态绑定到验证器的适当方法:

public interface Vehicle {
    void validate(Validator validator);
}

public class Car implements Vehicle {
    public void validate(Validator validator) {
        validator.validateCar(this);
    }
}

public class MotorBike implements Vehicle {
    public void validate(Validator validator) {
        validator.validateMotorBike(this);
    }
}

public class Validator {
    public void validateCar(Car car) {
       // validate a car
    }

    public void validateMotorBike(MotorBike motorBike) {
        // validate a motorbike
    }
}

public void process(Vehicle vehicle) {
    Validator validator = new Validator();
    vehicle.validate(validator);
    doSomething(vehicle);
}
于 2013-01-24T19:50:32.810 回答
0

正如 Oli Charlesworth 在他的评论中所写,这通常是由访问者模式完成的。http://en.wikipedia.org/wiki/Visitor_pattern

该 wiki 页面上有很好的 java 示例。

于 2013-01-24T19:25:36.067 回答
0

您最好的选择是 imo 策略模式,但是这不会让您远离进行 instanceof/isAssignableFrom 检查。但是,如果你构建得好,至少你可以将它抽象出来一些,通用地处理它,而不必担心添加额外的车辆类型时添加额外的检查。

我可以继续解释策略模式,但在这里做得更好:http ://www.javacodegeeks.com/2012/04/strategy-pattern.html (带有弹簧)

许多框架将有开箱即用的类来促进这一点。

于 2013-01-24T19:28:08.443 回答