文章出處
文章列表
使用頻率:★☆☆☆☆
一、什么是訪問者模式
在不修改已有程序結構的前提下,通過添加額外的“訪問者”來完成對已有代碼功能的提升;//定義參考鏈接
二、補充說明
數據結構的每一部分對象可以接收訪問者的調用,該部分對象向訪問者傳入自身對象,訪問者反過來執行該部分對象的相關操作;//有點難理解,看代碼吧~
三、角色
抽象訪問者
具體訪問者
抽象元素
具體元素
對象結構:能枚舉它的內部元素,允許訪問者訪問它的元素
客戶端
四、例子,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
文章列表
全站熱搜