有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

访问者模式的java使用

我有一节这样的课

 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;
        }
    }

我想使用访问者模式重构它,以防明天我们需要添加额外的逻辑,比如我今天添加的清理。我不确定我是否正确地使用了访问者模式,因为我没有accept方法和Visitable。谁能告诉我做这件事的正确方法吗

我创造

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) 个答案

  1. # 1 楼答案

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

    interface EmployeeVisitor {
        void visitEmployee(Employee employee);
    }
    
    class CleanUpEmployee implements EmployeeVisitor {
        void visitEmployee(Employee employee) {
            ...
        }
    }
    
    class Employee {
        void accept(EmployeeVisitor visitor) {
            visitor.visitEmployee(this);
        }
    }
    

    visitor模式是专门设计用来将一个或多个算法从它们所操作的类结构中分离出来的。访问者模式没有意义,除非有一个类结构,你试图使你的算法独立。在你的例子中,你似乎没有任何Employee的扩展,所以使用访问者真的没有任何价值——只需要制作类的算法和方法

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