zoukankan      html  css  js  c++  java
  • 访问者模式

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

     

    访问者模式结构:


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

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

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

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

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

     

     

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

    ·            

    ·      }  

    ·  }  

  • 相关阅读:
    771. Jewels and Stones
    706. Design HashMap
    811. Subdomain Visit Count
    733. Flood Fill
    117. Populating Next Right Pointers in Each Node II
    250. Count Univalue Subtrees
    94. Binary Tree Inorder Traversal
    116. Populating Next Right Pointers in Each Node
    285. Inorder Successor in BST
    292. Nim Game Java Solutin
  • 原文地址:https://www.cnblogs.com/jinzhengquan/p/1935889.html
Copyright © 2011-2022 走看看