我有一个这样的课程
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;
}
}
答案 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允许使用其上下文封装行为。