跳转到内容

访问者模式:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
YurikBot留言 | 贡献
Rocman留言 | 贡献
无编辑摘要
第49行: 第49行:
==[[Java]]的例子==
==[[Java]]的例子==


interface Visitor{
interface Visitor {
void visit(Wheel wheel);
void visit(Wheel wheel);
void visit(Engine engine);
void visit(Engine engine);
第56行: 第56行:
}
}


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


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


class Car {

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


class PrintVisitor implements Visitor{
class PrintVisitor implements Visitor {
public void visit(Wheel wheel){
public void visit(Wheel wheel) {
System.out.println("Visiting "+wheel.getName()
System.out.println("Visiting " + wheel.getName()
+" wheel");
+ " wheel");
}
}
public void visit(Engine engine){
public void visit(Engine engine) {
System.out.println("Visiting engine");
System.out.println("Visiting engine");
}
}
public void visit(Body body){
public void visit(Body body) {
System.out.println("Visiting body");
System.out.println("Visiting body");
}
}
public void visit(Car car){
public void visit(Car car) {
System.out.println("Visiting car");
System.out.println("Visiting car");
}
}
}
}


public class VisitorDemo{
public class VisitorDemo {
static public void main(String[] args){
static public void main(String[] args) {
Car car = new Car();
Car car = new Car();
Visitor visitor = new PrintVisitor();
Visitor visitor = new PrintVisitor();
第125行: 第124行:
这个例子是[http://htmlparser.sourceforge.net/ Htmlparser计划]里的一段示例。为获得一个Web页面的所有内容,采用如下的方式使用类 TextExtractingVisitor:
这个例子是[http://htmlparser.sourceforge.net/ Htmlparser计划]里的一段示例。为获得一个Web页面的所有内容,采用如下的方式使用类 TextExtractingVisitor:


Parser parser = new Parser ("http://pageIwantToParse.com");
Parser parser = new Parser("http://pageIwantToParse.com");
TextExtractingVisitor visitor = new TextExtractingVisitor ();
TextExtractingVisitor visitor = new TextExtractingVisitor();
parser.visitAllNodesWith (visitor);
parser.visitAllNodesWith(visitor);
System.out.println (visitor.getExtractedText());
System.out.println(visitor.getExtractedText());


==参考条目==
==参考条目==

2006年4月18日 (二) 09:14的版本

访问者模式是一种将算法与对象结构分离的软件设计模式

这个模式的基本想法如下:首先我们拥有一个由许多对象构成的对象结构,这些对象的都拥有一个accept方法用来接受访问者对象;访问者是一个接口,它拥有一个visit方法,这个方法对访问到的对象结构中不同类型的元素作出不同的反应;在对象结构的一次访问过程中,我们遍历整个对象结构,对每一个元素都实施accept方法,在每一个元素的accept方法中回调访问者的visit方法,从而使访问者得以处理对象结构的每一个元素。我们可以针对对象结构设计不同的实在的访问者类来完成不同的操作。

访问者模式使得我们可以在传统的单分派语言(如SmalltalkJavaC++)中模拟双分派技术。对于支持多分派的语言(如CLOS),访问者模式已经内置于语言特性之中了,从而不再重要。

Python的例子

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

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

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

class Car:
    def __init__(self):
        self.engine = Engine()
        self.body   = Body()
        self.wheels = [ Wheel("front left"), Wheel("front right"),
                        Wheel("back left") , Wheel("back right") ]
    def accept(self,visitor):
        visitor.visitCar(self)
        self.engine.accept( visitor )
        self.body.accept( visitor )
        for wheel in self.wheels:
            wheel.accept( visitor )

class PrintVisitor:
    def visitWheel(self,wheel):
        print "Visiting "+wheel.name+" wheel"
    def visitEngine(self,engine):
        print "Visiting engine"
    def visitBody(self,body):
        print "Visiting body"
    def visitCar(self,car):
        print "Visiting car"

car = Car()
visitor = PrintVisitor()
car.accept(visitor)

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());

参考条目