(Translated by https://www.hiragana.jp/)
访问者模式 - 维基百科,自由的百科全书 とべ转到内容ないよう

访问しゃしき

维基百科ひゃっか自由じゆうてき百科ひゃっかぜん
Visitor, UML class diagram.

访问しゃしき一种将算法与对象结构分离的软件设计しき

这个しきてき基本きほんそうほう如下:くびさきわが们拥ゆういち个由许多对象构成てき对象结构,这些对象てき拥有いち个accept方法ほうほうもちいらい接受せつじゅ访问しゃ对象;访问しゃいち个接こう,它拥ゆういち个visit方法ほうほう,这个方法ほうほう对访问到てき对象结构ちゅう不同ふどう类型てき元素げんそ作出さくしゅつ不同ふどうてきはん应;ざい对象结构てきいち访问过程ちゅうわが们遍历整个对ぞう结构,对每一个元素都实施accept方法ほうほうざいまいいち个元素的すてきaccept方法ほうほうちゅうかい访问しゃてきvisit方法ほうほう,从而使访问しゃとく以处对象结构てきごといち元素げんそわが们可以针对对ぞう结构设计不同ふどうてき实在てき访问しゃ类来完成かんせい不同ふどうてき操作そうさ

访问しゃしき使わが们可以在传统てき分派ぶんぱ语言(如SmalltalkJavaC++ちゅうそう分派ぶんぱわざ术。对于支持しじ分派ぶんぱてき语言(如CLOS),访问しゃしきやめ经内おけ于语げん特性とくせいなかりょう,从而さい重要じゅうよう

Pythonてきれい[编辑]

"""
Visitor pattern example.
"""

from abc import ABCMeta, abstractmethod

NOT_IMPLEMENTED = "You should implement this."

class CarElement:
    __metaclass__ = ABCMeta
    @abstractmethod
    def accept(self, visitor):
        raise NotImplementedError(NOT_IMPLEMENTED)

class Body(CarElement):
    def accept(self, visitor):
        visitor.visitBody(self)


class Engine(CarElement):
    def accept(self, visitor):
        visitor.visitEngine(self)


class Wheel(CarElement):
    def __init__(self, name):
        self.name = name
    def accept(self, visitor):
        visitor.visitWheel(self)

class Car(CarElement):
    def __init__(self):
        self.elements = [
            Wheel("front left"), Wheel("front right"),
            Wheel("back left"), Wheel("back right"),
            Body(), Engine()
        ]

    def accept(self, visitor):
        for element in self.elements:
            element.accept(visitor)
        visitor.visitCar(self)

class CarElementVisitor:
    __metaclass__ = ABCMeta
    @abstractmethod
    def visitBody(self, element):
        raise NotImplementedError(NOT_IMPLEMENTED)
    @abstractmethod
    def visitEngine(self, element):
        raise NotImplementedError(NOT_IMPLEMENTED)
    @abstractmethod
    def visitWheel(self, element):
        raise NotImplementedError(NOT_IMPLEMENTED)
    @abstractmethod
    def visitCar(self, element):
        raise NotImplementedError(NOT_IMPLEMENTED)

class CarElementDoVisitor(CarElementVisitor):
    def visitBody(self, body):
        print("Moving my body.")
    def visitCar(self, car):
        print("Starting my car.")
    def visitWheel(self, wheel):
        print("Kicking my {} wheel.".format(wheel.name))
    def visitEngine(self, engine):
        print("Starting my engine.")


class CarElementPrintVisitor(CarElementVisitor):
    def visitBody(self, body):
        print("Visiting body.")
    def visitCar(self, car):
        print("Visiting car.")
    def visitWheel(self, wheel):
        print("Visiting {} wheel.".format(wheel.name))
    def visitEngine(self, engine):
        print("Visiting engine.")

car = Car()
car.accept(CarElementPrintVisitor())
car.accept(CarElementDoVisitor())

Javaてきれい[编辑]

 interface Visitor {
     void visit(Wheel wheel);
     void visit(Engine engine);
     void visit(Body body);
     void visit(Car car);
 }

 class Wheel {
     private String name;
     Wheel(String name) {
         this.name = name;
     }
     String getName() {
         return this.name;
     }
     void accept(Visitor visitor) {
         visitor.visit(this);
     }
 }
  
 class Engine {
     void accept(Visitor visitor) {
         visitor.visit(this);
     }
 }

 class Body {
     void accept(Visitor visitor) {
         visitor.visit(this);
     }
 }

 class Car {
     private Engine  engine = new Engine();
     private Body    body   = new Body();
     private Wheel[] wheels 
         = { new Wheel("front left"), new Wheel("front right"),
             new Wheel("back left") , new Wheel("back right")  };
     void accept(Visitor visitor) {
         visitor.visit(this);
         engine.accept(visitor);
         body.accept(visitor);
         for (int i = 0; i < wheels.length; ++ i)
             wheels[i].accept(visitor);
     }
 }

 class PrintVisitor implements Visitor {
     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");
     }
 }

 public class VisitorDemo {
     static public void main(String[] args) {
         Car car = new Car();
         Visitor visitor = new PrintVisitor();
         car.accept(visitor);
     }
 }

一个实际的例子[编辑]

这个れいHtmlparser计划页面そん档备份そん互联网档あんさとてきいちだんしめせれい。为获とくいち个Web页面てき所有しょゆう内容ないようさいよう如下てき方式ほうしき使用しよう类 TextExtractingVisitor:

Parser parser = new Parser("http://pageIwantToParse.com[永久えいきゅう失效しっこう連結れんけつ]");
TextExtractingVisitor visitor = new TextExtractingVisitor();
parser.visitAllNodesWith(visitor);
System.out.println(visitor.getExtractedText());

参考さんこう条目じょうもく[编辑]