人在江湖

            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
          主站蜘蛛池模板: 峨边| 长宁县| 镇赉县| 油尖旺区| 海门市| 安阳县| 莱阳市| 元谋县| 塔城市| 长武县| 赤壁市| 南城县| 景宁| 海丰县| 东乡| 平塘县| 东至县| 专栏| 中方县| 南投县| 平阳县| 志丹县| 广平县| 东安县| 百色市| 和田市| 凤山市| 探索| 常山县| 平湖市| 宁海县| 清水河县| 惠州市| 澄迈县| 罗定市| 桓台县| 宝清县| 芮城县| 沙坪坝区| 宜丰县| 南京市|