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