如何在将共同责任添加到 class 的同时删除条件语句?

How can remove conditional statements while adding the common responsibility to the class?

我正在建立一个验证引擎。有共同的规则,我把它们统一在一个父接口静态方法中。

    public interface EmployeeValidator {
        Predicate<Employee> build(Employee employee);

        static Predicate<Employee> getCommonRules(Employee employee) {
            return validateAge().and(validateGenger());
        }

        private static Predicate<Employee> validateAge() {
            ...
        }

        private static Predicate<Employee> validateGenger() {
            ...
        }
    }

现在,实现此接口的class将为其添加更多验证规则。 EmployeeValidator

会有多种实现
    class BackOfficeStaffValidator implements EmployeeValidator {

        @Override
        public Predicate<Employee> build(Employee employee) {
            return EmployeeValidator.getCommonRules(employee).and(validationsOnDirectReports());
        }

        private Predicate<Employee> validationsOnDirectReports() {
            ...
        }
    }

但是这种方法的问题,在客户端。我需要条件语句或 switch case 到 select 正确的实现。

    Employee employee = ...;

    if(employee.staffType() == StaffType.TECHNICAL) {
        Predicate<Employee> validator = new TechnicalStaffValidator().build(employee);
    } else if(employee.staffType() == StaffType.BACK_OFFICE) {
        Predicate<Employee> validator = new BackOfficeStaffValidator().build(employee);
    }

有没有办法改进我当前的设计?如果此方法没有朝着正确的方向发展,请随时提出替代方法。

您可以将 'isReponsibleFor(StaffType)' 之类的方法添加到您的 EmployeeValidator 接口。 每个验证器现在都可以检查它是否是给定类型的响应。

将所有验证器添加到列表中并遍历验证器列表。如果您的验证器负责给定的类型,请调用构建方法。 您还可以添加检查,因此每种类型只有一个验证器等等。

List<EmployeeValidator> validators = getListOfValidators();

for (EmployeeValidator validator : validators) {
   if (validator.isReponsibleFor(employee.staffType()) {
      Predicate<Employee> validator = validator.build(employee);
      // uses the first validator only
      break;
   }
}