如何在将共同责任添加到 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;
}
}
我正在建立一个验证引擎。有共同的规则,我把它们统一在一个父接口静态方法中。
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;
}
}