文章出處

使用頻率:★☆☆☆☆

一、什么是訪問者模式

在不修改已有程序結構的前提下,通過添加額外的“訪問者”來完成對已有代碼功能的提升;//定義參考鏈接

二、補充說明

數據結構的每一部分對象可以接收訪問者的調用,該部分對象向訪問者傳入自身對象,訪問者反過來執行該部分對象的相關操作;//有點難理解,看代碼吧~

三、角色

抽象訪問者

具體訪問者

抽象元素

具體元素

對象結構:能枚舉它的內部元素,允許訪問者訪問它的元素

客戶端

四、例子,JAVA代碼

參考維基百科例子,鏈接地址,稍微修改了下

例子說明:車為對象結構角色,里面包含輪子,車身等部分對象,訪問者角色對象為PrintVisitor,車接受該訪問者讓其訪問車的各個組成對象并打印信息;

抽象訪問者

package com.pichen.dp.behavioralpattern.visitor;

public interface Visitor {
    void visit(Wheel wheel);

    void visit(Engine engine);

    void visit(Body body);

    void visit(Car car);
}

具體訪問者

package com.pichen.dp.behavioralpattern.visitor;

public 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");
    }
}

抽象元素

package com.pichen.dp.behavioralpattern.visitor;
public interface Visitable {
    public void accept(Visitor visitor);
}

具體元素,車身,引擎,車輪。。。

package com.pichen.dp.behavioralpattern.visitor;

public class Body implements Visitable {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}
package com.pichen.dp.behavioralpattern.visitor;

public class Engine implements Visitable{
    @Override    
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}
package com.pichen.dp.behavioralpattern.visitor;

public class Wheel implements Visitable{
    private String name;

    Wheel(String name) {
        this.name = name;
    }

    String getName() {
        return this.name;
    }
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

對象結構

package com.pichen.dp.behavioralpattern.visitor;

public class Car implements Visitable{
    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") };
    @Override
    public 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);
    }
}

客戶端Main

package com.pichen.dp.behavioralpattern.visitor;

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

結果打印,成功訪問到car內部各個元素

Visiting car
Visiting engine
Visiting body
Visiting front left wheel
Visiting front right wheel
Visiting back left wheel
Visiting back right wheel

 


文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()