学了这么长时间的java,对于Visitor设计模式还一直感觉非常陌生,不知道Visitor模式到底是怎么样的。这里只是简单的Visitor模式体现的例子。如果对Java的设计模式掌握的非常透彻,那么在面向对象编程里肯定会应用的游刃有余,
(没有用Visitor模式的时候) 一个列出公司所有员工信息和统计公司所有员工工资总数的两个方法: 注意:此时这两个方法都是在Company类中完成的 public class Company{ public void displayEmployees(){ system.out.println("all staff:"); system.out.println(); Iterator iter = theEmployees.iterator(); //循环把所有员工的信息遍历出来 while(iter.hasNext()){ Employee emp = (Employee)iter.next(); system.out.println("Number:"+emp.getEmpNumber()+",Name:"+emp.getEmpName()); } } public void getSalaryBill(){ int totalSalary = 0; Iterator iter = theEmployees.iterator(); //循环累加所有员工工资 while(iter.hasNext()){ Employee emp = (Employee)iter.next(); totalSalary += emp.getSalary(); } return totalSalary; } } 注:没有使用Visitor模式的时候,我们会在Company类中写两个方法,专门为了实现显示员工信息和统计员工工资 (二者有一个共同的逻辑,即,都要遍历Empoyees集合) 以下用Visitor设计模式实现上面的要求: //先定义一个interface public interface EmployeeVisitor{ //为什么该方法里面只传一个Employee类型的对象参数 public abstract void visit(Employee emp); } //再分别写两个class实现上面接口 public class EmployeeDisplayVisitor implements EmployeeVisitor{ //实现EmployeeVisitor接口中的方法 public void visit(Employee emp){ system.out.println("This is "+emp); } } public class EmployeeSalaryVisitor implements EmployeeVisitor{ private int theTotalSalaryp; public EmployeeSalaryVisitor(){ theTotalSalary = 0; } public void visit(Employee emp){ theTotalSalary += emp.getSalary(); } public int getTotalSalary(){ return theTotalSalary; } } 可以看到,现在我们用Visitor模式实现上面的两个方法,但是我们不是在Company中完成的,而是另外写了两个类来实现那个接口【EmployeeVisitor】,那么,我们Company类可能就不用那么冗余了,重置Company类: public class Company{ private Conllection theEmployees; public void displayEmployees(){ system.out.println("Number:"+emp.getEmpNumber()+",Name:"+emp.getEmpName()); EmployeeDisplayVisitor displayVisitor = new EmployeeDisplayVisitor (); this.accept(displayVisitor); } public int getSalaryBill(){ EmployeeSalaryVisitor salaryVisitor = new EmployeeSalaryVisitor(); this.accept(salaryVisitor); return salaryVisitor.getTotalSalary(); } //此方法,传一个EmployeeVisitor 的接口,那么不论是【显示所有员工信息的接口】还是【累积员工工资的接口】都可以通过调用此方法来完成各自所要完成的功能 private void accept(EmployeeVisitor visitor){ iterator iter = theEmployees.iterator(); while(iter.hasNext()){ Employee emp = (Employee)iter.next(); //此处调用的visit方法,它是根据EmployeeVisitor 接口的不同实现类来决定调用哪个的 visitor.visit(emp); } } } 这样,一个访问者(Visitor)设计模式就完成了,注意领会其得意之处... 根据我自己对访问者(Visitor)设计模式的理解,到底这种设计模式在什么时候使用呢? ->针对于某一个对象,有【多个需求】的实现都会用到此对象 ->在某个class中,多个方法的实现有相似之处,可以提取出来 每种设计模式可能在项目中并不是单一存在的,他们可以结合使用 |
|