人在江湖

            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 人在江湖 閱讀(883) 評論(0)  編輯  收藏 所屬分類: design pattern
          主站蜘蛛池模板: 广德县| 江华| 社会| 沁水县| 新蔡县| 新兴县| 乐陵市| 墨江| 桃源县| 吉林省| 许昌县| 顺平县| 古交市| 定襄县| 福泉市| 论坛| 长武县| 合水县| 资源县| 隆回县| 湖口县| 长治县| 印江| 宜州市| 凉城县| 仙桃市| 扎赉特旗| 都江堰市| 鸡东县| 彭水| 无棣县| 健康| 扬中市| 商南县| 宣城市| 吉首市| 开阳县| 甘谷县| 和静县| 陇川县| 遵义市|