首页 > 代码库 > 设计模式24-访问者模式

设计模式24-访问者模式

1. 概念

   表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作

2. 案例 

import java.util.ArrayList;import java.util.List;import java.util.Random;/** *  * 声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义的。 * 抽象元素一般有两类方法,一部分是本身的业务逻辑,另外就是允许接收哪类访问者来访问 *  */abstract class Element {      public abstract void accept(IVisitor visitor);  //声明接受哪一类访问者访问     public abstract void doSomething();  //本身的业务逻辑 }   /** * 抽象访问者 *  声明访问者可以访问哪些元素,具体到程序中就是visit方法中的参数定义哪些对象是可以被访问的  */interface IVisitor {      public void visit(Element element);  }  /** * 实现抽象访问者所声明的方法,它影响到访问者访问到一个类后该干什么,要做什么事情 */class Visitor implements IVisitor {            public void visit(Element element) {          element.doSomething();      }        }  /** * 实现抽象元素类所声明的accept方法,通常都是visitor.visit(this),基本上已经形成一种定式了 */class ConcreteElement1 extends Element {      public void doSomething(){          System.out.println("这是元素1");      }            public void accept(IVisitor visitor) {          System.out.println("为元素1定义新操作 .");        visitor.visit(this);   //通过这个方法 来调用本身的doSomething方法      在这里可以定义新的操作    }  }    class ConcreteElement2 extends Element {      public void doSomething(){          System.out.println("这是元素2");      }            public void accept(IVisitor visitor) {          System.out.println("为元素2定义新操作 .");        visitor.visit(this);      }  }  /** * 一个元素的容器,一般包含一个容纳多个不同类、不同接口的容器,如List、Set、Map等   */class ObjectStruture {      public static List<Element> getList(){          List<Element> list = new ArrayList<Element>();          Random ran = new Random();          for(int i=0; i<10; i++){              int a = ran.nextInt(100);              if(a>50){                  list.add(new ConcreteElement1());              }else{                  list.add(new ConcreteElement2());              }          }          return list;      }  }    public class Client {      public static void main(String[] args){          List<Element> list = ObjectStruture.getList();          for(Element e: list){              e.accept(new Visitor());          }      }  }