zoukankan      html  css  js  c++  java
  • Visitor

    访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以不改变各元素的类的前提下定义作用于这些元素的新操作。

    访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于操作之间的耦合解脱开,使得操作集合可以相对自由地演化。

    访问者模式的优点就是增添新的操作比较容易,因为增加新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问者对象中。

    Visitor(Action):为该对象结构中ConcreteElement的每个具体类声明一个visit操作。

    ConcreteVisitor(Fail、Success):具体访问者,实现Visitor声明操作。每个操作实现算法的一部分,而该算法片段乃是对应结构中对象的类。

    Element:定义了一个accept操作,它以一个访问者作为参数。

    ConcreteElement:具体元素,实现accept操作。

    ObjectStruture:能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。

    1 //访问者
    2 public abstract class Action {
    3 
    4     public abstract void getManConclusion(Man m);
    5     
    6     public abstract void getWomanConclusion(Woman w);
    7     
    8 }
     1 //具体访问者,实现每个由Visitor声明的操作,每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类。
     2 class Success extends Action{
     3 
     4     @Override
     5     public void getManConclusion(Man m) {
     6         System.out.println(m.getClass().getName() + " " + this.getClass().getName() + " 时,背后多半有一个伟大的女人。");
     7     }
     8 
     9     @Override
    10     public void getWomanConclusion(Woman w) {
    11         System.out.println(w.getClass().getName() + " " + this.getClass().getName() + " 时,背后多半有一个不成功的男人。");
    12     }
    13     
    14 }
     1 class Fail extends Action{
     2 
     3     @Override
     4     public void getManConclusion(Man m) {
     5         System.out.println(m.getClass().getName() + " " + this.getClass().getName() + " 时,闷头喝酒,谁都不用劝。");
     6     }
     7 
     8     @Override
     9     public void getWomanConclusion(Woman w) {
    10         System.out.println(w.getClass().getName() + " " + this.getClass().getName() + " 时,眼泪汪汪,谁也劝不了。");
    11     }
    12     
    13 }
    1 //被访问者
    2 public abstract class Person {
    3     
    4     public abstract void accept(Action v); 
    5     
    6 }
     1 class Man extends Person{
     2 
     3     @Override
     4     public void accept(Action v) {
     5         v.getManConclusion(this);   //充分利用双分派技术,实现处理与数据结构分离。
     6     }
     7     
     8     public void operationA(){}
     9     
    10 }
    1 class Woman extends Person{
    2 
    3     @Override
    4     public void accept(Action v) {
    5         v.getWomanConclusion(this);
    6     }
    7     
    8     public void operationB(){}
    9 }
     1 //能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。
     2 public class ObjectStructure {
     3 
     4     private List<Person> elements = new ArrayList<Person>();
     5     
     6     public void attach(Person e){
     7         elements.add(e);
     8     }
     9     
    10     public void detach(Person e){
    11         elements.remove(e);
    12     }
    13     
    14     public void display(Action v){
    15         for(Person e : elements){
    16             e.accept(v);
    17         }
    18     }
    19     
    20 }
     1     public static void main(String[] args) {
     2         ObjectStructure o = new ObjectStructure();
     3         
     4         o.attach(new Man());
     5         o.attach(new Woman());
     6         
     7         Success s = new Success();
     8         Fail f = new Fail();
     9         
    10         o.display(s);
    11         o.display(f);
    12     }

    打印结果:

    org.visitor.Man org.visitor.Success 时,背后多半有一个伟大的女人。
    org.visitor.Woman org.visitor.Success 时,背后多半有一个不成功的男人。
    org.visitor.Man org.visitor.Fail 时,闷头喝酒,谁都不用劝。
    org.visitor.Woman org.visitor.Fail 时,眼泪汪汪,谁也劝不了。

  • 相关阅读:
    MySQL DELAY_KEY_WRITE Option
    More on understanding sort_buffer_size
    myisam_sort_buffer_size vs sort_buffer_size
    share-Nothing原理
    GROUP_CONCAT(expr)
    Mysql History list length 值太大引起的问题
    Why is the ibdata1 file continuously growing in MySQL?
    洛谷1201 贪婪的送礼者 解题报告
    洛谷1303 A*B Problem 解题报告
    洛谷2142 高精度减法 解题报告
  • 原文地址:https://www.cnblogs.com/xuekyo/p/2625583.html
Copyright © 2011-2022 走看看