访问者模式的目的是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。

 

访问者模式结构:


抽象访问者角色:声明了一个或者多个访问操作,形成所有的具体元素角色必须实现的接口

具体访问者角色:实现抽象访问者角色所声明的接口,也就是抽象访问者所声明的各个访问操作

抽象节点角色:声明一个接受操作,接受一个访问者对象作为一个参量

具体节点角色:实现了抽象元素所规定的接受操作

结构对象角色:可以遍历结构中的所有元素,提供一个高层次的接口让访问者对象可以访问每一个元素,可以设计成一个符合对象或者一个聚集

 

 

  1. public interface Person {  
  2.       void accept(Visitor visitor);  
  3. }  
  4.   
  5.   
  6. public class Woman implements Person{  
  7.   
  8.     public void accept(Visitor visitor) {  
  9.           visitor.visit(this);  
  10.     }  
  11. }  
  12.   
  13.   
  14. public class Man implements Person{  
  15.   
  16.     public void accept(Visitor visitor) {  
  17.         visitor.visit(this);  
  18.     }  
  19. }  
  20. public interface Visitor {  
  21.       public void visit(Man man);  
  22.       public void visit(Woman girl);  
  23. }  
  24.   
  25. //成功时ManWoman的不同表现  
  26. public class Success implements Visitor{  
  27.   
  28.     public void visit(Man man) {  
  29.         System.out.println("当男人成功时,背后多半有一个伟大的女人");  
  30.     }  
  31.   
  32.   
  33.     public void visit(Woman woman) {  
  34.         System.out.println("当女人成功时,背后大多有一个不成功的男人");  
  35.     }  
  36. }  
  37.   
  38. //恋爱时ManWoman的不同表现  
  39. public class Love implements Visitor{  
  40.   
  41.     public void visit(Man man) {  
  42.         System.out.println("当男人恋爱时,凡事不懂也装懂");  
  43.     }  
  44.   
  45.   
  46.     public void visit(Woman girl) {  
  47.         System.out.println("当女人恋爱时,遇事懂也装不懂");  
  48.     }  
  49. }  

·  public class ObjectStructure {  

·      private List<Person> elements = new ArrayList<Person>();  

·    

·      public void attach(Person element){  

·          elements.add(element);  

·      }  

·        

·      public void detach(Person element){  

·          elements.remove(elements);  

·      }  

·        

·      //遍历各种具体元素并执行他们的accept方法  

·      public void display(Visitor visitor){  

·          for(Person p:elements){  

·              p.accept(visitor);  

·          }  

·      }  

·  }  

·    

·    

·  public class Client {  

·        public static void main(String[] args) {  

·          ObjectStructure o = new ObjectStructure();  //依赖于ObjectStructure  

·          //实例化具体元素  

·          o.attach(new Man());    

·          o.attach(new Woman());  

·            

·          //当成功时不同元素的不同反映  

·          Visitor success = new Success();           //依赖于抽象的Visitor接口  

·          o.display(success);  

·            

·          //当恋爱时的不同反映  

·          Visitor amativeness = new Love();          //依赖于抽象的Visitor接口  

·          o.display(amativeness);  

·            

·      }  

·  }  

posted on 2011-01-14 20:40  魔战  阅读(244)  评论(0编辑  收藏  举报