使用頻率:★☆☆☆☆
一、什麼是通路者模式
在不修改已有程式結構的前提下,通過添加額外的“通路者”來完成對已有代碼功能的提升;//定義參考連結
二、補充說明
資料結構的每一部分對象可以接收通路者的調用,該部分對象向通路者傳入自身對象,通路者反過來執行該部分對象的相關操作;//有點難了解,看代碼吧~
三、角色
抽象通路者
具體通路者
抽象元素
具體元素
對象結構:能枚舉它的内部元素,允許通路者通路它的元素
用戶端
四、例子,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 轉載請注明出處,謝謝~