分享

Java设计模式 之 Visitor(访问者)

 Go_Ahead 2012-12-26
       学了这么长时间的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中,多个方法的实现有相似之处,可以提取出来
 
 
 
每种设计模式可能在项目中并不是单一存在的,他们可以结合使用
 
 
 
 
 
 
 
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多