人在江湖

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            82 Posts :: 10 Stories :: 169 Comments :: 0 Trackbacks

          參考:http://en.wikipedia.org/wiki/Visitor_pattern

          class=thumbimage

          Example
          The following example is in the Java programming language, and shows how the contents of a tree of nodes (in this case describing the components of a car) can be printed. Instead of creating "print" methods for each subclass (Wheel, Engine, Body, and Car), a single class (CarElementPrintVisitor) performs the required printing action. Because different subclasses require slightly different actions to print properly, CarElementDoVisitor dispatches actions based on the class of the argument passed to it.

          alt=A Diagram of the Java Code Example.        I, the copyright holder of this work, hereby release it into the public domain.  This applies worldwide. In case this is not legally possible, I grant any entity the right to use this work for any purpose, without any conditions, unless such conditions are required by law.

          interface CarElementVisitor {
              void visit(Wheel wheel);
              void visit(Engine engine);
              void visit(Body body);
              void visit(Car car);
          }
          interface CarElement {
              void accept(CarElementVisitor visitor); // CarElements have to provide accept().
          }
          class Wheel implements CarElement {
              private String name;
              public Wheel(String name) {
                  this.name = name;
              }
              public String getName() {
                  return this.name;
              }
              public void accept(CarElementVisitor visitor) {
                  visitor.visit(this);
              }
          }
          class Engine implements CarElement {
              public void accept(CarElementVisitor visitor) {
                  visitor.visit(this);
              }
          }
          class Body implements CarElement {
              public void accept(CarElementVisitor visitor) {
                  visitor.visit(this);
              }
          }
          class Car implements CarElement{
              CarElement[] elements;
              public CarElement[] getElements() {
                  return elements.clone(); // Return a copy of the array of references.
              }
              public Car() {
                  this.elements = new CarElement[]
                    { new Wheel("front left"), new Wheel("front right"),
                      new Wheel("back left") , new Wheel("back right"),
                      new Body(), new Engine() };
              }
              public void accept(CarElementVisitor visitor) {
                  for(CarElement element : this.getElements()) {
                      element.accept(visitor);
                  }
                  visitor.visit(this);
              }
          }
          class CarElementPrintVisitor implements CarElementVisitor {
              public void visit(Wheel wheel) {    
                  System.out.println("Visiting "+ wheel.getName()
                                      + " wheel");
              }
              public void visit(Engine engine) {
                  System.out.println("Visiting engine");
              }
              public void visit(Body body) {
                  System.out.println("Visiting body");
              }
              public void visit(Car car) {    
                  System.out.println("Visiting car");
              }
          }
          class CarElementDoVisitor implements CarElementVisitor {
              public void visit(Wheel wheel) {
                  System.out.println("Kicking my "+ wheel.getName() + " wheel");
              }
              public void visit(Engine engine) {
                  System.out.println("Starting my engine");
              }
              public void visit(Body body) {
                  System.out.println("Moving my body");
              }
              public void visit(Car car) {
                  System.out.println("Starting my car");
              }
          }
          public class VisitorDemo {
              static public void main(String[] args){
                  Car car = new Car();
                  car.accept(new CarElementPrintVisitor());
                  car.accept(new CarElementDoVisitor());
              }

          posted on 2011-02-13 14:19 人在江湖 閱讀(880) 評論(0)  編輯  收藏 所屬分類: design pattern
          主站蜘蛛池模板: 左贡县| 通城县| 芜湖县| 永新县| 长宁县| 容城县| 太谷县| 苏尼特左旗| 从化市| 孝昌县| 巢湖市| 托克逊县| 勐海县| 将乐县| 综艺| 青河县| 宁陕县| 贺州市| 乳源| 巨野县| 定边县| 南靖县| 台北市| 大连市| 兴山县| 阿图什市| 梧州市| 特克斯县| 通辽市| 诸城市| 陆丰市| 新兴县| 宜川县| 囊谦县| 卓尼县| 天水市| 疏附县| 南丹县| 岑溪市| 光泽县| 灵寿县|