0

我有一个抽象工厂类 StudentValidatorFactory,它应该创建(基于指定的参数)必须注入验证映射的各种 StudentValidator 类实例(参见下面的代码)。

public class StudentValidatorFactory{
    public static final int JUNIOR_STUDENT_TYPE = 1;

    public static final int SENIOR_STUDENT_TYPE = 2;

    public StudentValidator createStudentValidator(int studentType) throws StudentValidatorCreationException{
            Map<String,ValidationBean> validationMap = readValiationMapFromPersistentOrCachedStorage(studentType);
            switch (studentType){
                  case JUNIOR_STUDENT:
                      return new JuniorStudentValidator(validationMap);
                  case SENIOR_STUDENT:
                      return new SeniorStudentValidator(validationMap);
            }  
    }
}

public interface StudentValidator{
      void validate(Student student) throws StudentValidationException;
}


public class JuniorStudentValidator{
     private Map<String, ValidationBean> validationMap;           

     public JuniorStudentValidator(Map<String,ValidationBean> validationMap){
         this.validationMap = validationMap;
     }

     public void validate(Student student) throws StudentValidationException{
         // make use of validation map for apply junior student related validations on the student
     } 

}


public class SeniorStudentValidator{
     private Map<String, ValidationBean> validationMap;           

     public SeniorStudentValidator(Map<String,ValidationBean> validationMap){
         this.validationMap = validationMap;
     }


     public void validate(Student student) throws StudentValidationException{
         // make use of validation map for apply senior student related validations on the student
     } 

}

我的问题是关于StudentValidatorFactory.createStudentValidator(int studentType)方法是否应该在 create 方法中从持久存储(基于学生类型)读取验证图?否则,工厂是否应该了解/依赖此类实施细节?

如果在创建学生验证器时有一个避免 switch(studentType) 语句的解决方案,我将不胜感激 - 我的想法是拥有一个内部管理的映射并通过反射执行 StudentValidator 具体类实例化。

使用这种技术的优点是验证器更容易测试(通过依赖注入)。

4

1 回答 1

0

readValiationMapFromPersistentOrCachedStorage(studentType)在分离的服务接口中提取,并在使用属性或构造函数参数StudentValidatorService中注入服务实例:StudentValidatorFactory

public interface StudentValidatorService {
    Map<String,ValidationBean> getValidationMap(int studentType);
}

public class StudentValidatorFactory{
    public static final int JUNIOR_STUDENT_TYPE = 1;

    public static final int SENIOR_STUDENT_TYPE = 2;

    public StudentValidatorFactory(StudentValidatorService studentValidatorService) {
        this.studentValidatorService = studentValidatorService;
    }

    public StudentValidator createStudentValidator(int studentType) throws StudentValidatorCreationException{
            Map<String,ValidationBean> validationMap = studentValidatorService.getValidationMap(studentType);
            switch (studentType){
                  case JUNIOR_STUDENT:
                      return new JuniorStudentValidator(validationMap);
                  case SENIOR_STUDENT:
                      return new SeniorStudentValidator(validationMap);
            }  
    }
}

现在您可以编写一个StudentValidatorService由数据库支持的实现。或者您可以编写一个模拟实现进行测试。实现现在与使用分离。


要删除 switch-case,请使用枚举反转它:

public enum StudentType {
    JUNIOR_STUDENT {
        public StudentValidator getValidator(Map<String,ValidationBean> validationMap) {
            return new JuniorStudentValidator(validationMap);
        }
    },
    SENIOR_STUDENT {
        public StudentValidator getValidator(Map<String,ValidationBean> validationMap) {
            return new SeniorStudentValidator(validationMap);
        }
    };

    public abstract StudentValidator getValidator(Map<String,ValidationBean> validationMap);
}

public class StudentValidatorFactory{

    public StudentValidatorFactory(StudentValidatorService studentValidatorService) {
        this.studentValidatorService = studentValidatorService;
    }

    public StudentValidator createStudentValidator(StudentType studentType) throws StudentValidatorCreationException{
            Map<String,ValidationBean> validationMap = studentValidatorService.getValidationMap(studentType);
            return studentType.getValidator(validationMap);
    }
}
于 2011-12-20T12:45:44.173 回答