如何在向类添加共同责任的同时删除条件语句?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在向类添加共同责任的同时删除条件语句?相关的知识,希望对你有一定的参考价值。

我正在建立一个验证引擎。有一些通用规则,已将其合并到父接口静态方法中。

    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() {
            ...
        }
    }

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

将有多种实现
    class BackOfficeStaffValidator implements EmployeeValidator {

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

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

但是这种方法的问题在于客户。我需要条件语句或切换大小写来选择适当的实现。

    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);
    }

是否有改善我当前设计的方法?如果这种方法没有朝着正确的方向发展,请随时提出另一种方法。

答案

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

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

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;
   }
}

以上是关于如何在向类添加共同责任的同时删除条件语句?的主要内容,如果未能解决你的问题,请参考以下文章

如何在vs2008 MFC中添加、删除成员变量

如何在 C# 运行时向类添加属性?

在 JSP 中的 <% %> 代码片段中添加链接

倒向类语句

如何删除使用片段管理器添加的所有片段?

如何在按钮单击时添加/删除片段?