访客模式的使用

时间:2017-03-28 02:45:04

标签: java oop design-patterns

我有一个这样的课程

 public  EmployeeRepositoryImpl{
    public Employee save(final Employee employee) {

      return    employeeDao.save(sanitizeEmployee(employee));
       }

        Employee sanitizeEmployee(Employee employee){

            employee.setName(cleanUpBadData(employee.getName());
            employee.setPhone(cleanUpBadData(employee.getPhone());
            employee.setAddress(cleanUpBadData(employee.getAddress());
      ......

            return employee;
        }

    private static String cleanUpBadData(String attribute) {
            //cleanbaddata here
            return attribute;
        }
    }

我希望明天使用访问者模式重构这个我们需要添加额外的逻辑,比如我今天添加的清理。我不确定我是否正确访问了访问者模式,因为我没有接受方法和Visitable.Can任何人请更正我是正确的方法。

我创建了

public interface EmployeeVisitor {


    void visitEmployee(Employee employee);

}

public class EmployeeVisitorImpl implements EmployeeVisitor {

public void visitEmployee(Employee employee)
{

                employee.setName(cleanUpBadData(employee.getName());
                employee.setPhone(cleanUpBadData(employee.getPhone());
                employee.setAddress(cleanUpBadData(employee.getAddress());
          ......

                return employee;
            }

        private static String cleanUpBadData(String attribute) {
                //cleanbaddata here
                return attribute;
            }

}

1 个答案:

答案 0 :(得分:2)

访问者模式的正确实现如下所示:

interface EmployeeVisitor {
    void visitEmployee(Employee employee);
}

class CleanUpEmployee implements EmployeeVisitor {
    void visitEmployee(Employee employee) {
        ...
    }
}

class Employee {
    void accept(EmployeeVisitor visitor) {
        visitor.visitEmployee(this);
    }
}

访问者模式专门用于将一个或多个算法与其操作的类结构分开。除非您尝试使算法独立于类结构,否则访问者模式没有意义。在您的情况下,您似乎没有Employee的任何扩展名,因此使用访问者真的没有价值 - 只需制作该类的算法方法。

如果您的目的是能够在不更改的情况下向类中添加其他操作,那么还有其他模式可能更有用。例如,https://en.wikipedia.org/wiki/Strategy_pattern允许在运行时选择行为,https://en.wikipedia.org/wiki/Command_pattern允许使用其上下文封装行为。