人在江湖

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            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 人在江湖 閱讀(884) 評論(0)  編輯  收藏 所屬分類: design pattern
          主站蜘蛛池模板: 陈巴尔虎旗| 石柱| 建瓯市| 青海省| 泽州县| 德保县| 静宁县| 建阳市| 应城市| 屏东县| 紫阳县| 凯里市| 瓮安县| 喀什市| 民权县| 常德市| 平江县| 龙泉市| 海原县| 灵台县| 陆河县| 天镇县| 佛山市| 清徐县| 新野县| 乌兰察布市| 仙桃市| 隆德县| 北海市| 白银市| 西乡县| 河津市| 巢湖市| 万山特区| 津南区| 铜陵市| 南昌县| 嘉荫县| 马鞍山市| 太湖县| 襄汾县|