天天看點

【設計模式】通路者模式

使用頻率:★☆☆☆☆

一、什麼是通路者模式

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

二、補充說明

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

三、角色

抽象通路者

具體通路者

抽象元素

具體元素

對象結構:能枚舉它的内部元素,允許通路者通路它的元素

用戶端

四、例子,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      

@Author      風一樣的碼農

@HomePageUrl http://www.cnblogs.com/chenpi/

@Copyright      轉載請注明出處,謝謝~