在訪問者模式(Visitor Pattern)中邢笙,我們使用了一個訪問者類,它改變了元素類的執(zhí)行算法。通過這種方式,元素的執(zhí)行算法可以隨著訪問者改變而改變颜屠。這種類型的設計模式屬于行為型模式。根據(jù)模式鹰祸,元素對象已接受訪問者對象甫窟,這樣訪問者對象就可以處理元素對象上的操作。
關鍵代碼:在數(shù)據(jù)基礎類里面有一個方法接受訪問者蛙婴,將自身引用傳入訪問者粗井。
優(yōu)點: 1、符合單一職責原則街图。 2浇衬、優(yōu)秀的擴展性。 3餐济、靈活性耘擂。
缺點: 1、具體元素對訪問者公布細節(jié)絮姆,違反了迪米特原則醉冤。 2、具體元素變更比較困難滚朵。 3冤灾、違反了依賴倒置原則,依賴了具體類辕近,沒有依賴抽象韵吨。
注意事項:訪問者可以對功能進行統(tǒng)一,可以做報表移宅、UI归粉、攔截器與過濾器。
- 定義一個表示元素的接口漏峰。
/**
* 1. 定義一個表示元素的接口糠悼。
* @author mazaiting
*/
public interface ComputerPart {
public void accept(ComputerPartVisitor visitor);
}
- 創(chuàng)建擴展了上述類的實體類。
/**
* 2. 創(chuàng)建擴展了上述類的實體類浅乔。
* @author mazaiting
*/
public class Computer implements ComputerPart{
public void accept(ComputerPartVisitor visitor) {
visitor.visit(this);
}
}
/**
* 2. 創(chuàng)建擴展了上述類的實體類倔喂。
* @author mazaiting
*/
public class Keyboard implements ComputerPart{
public void accept(ComputerPartVisitor visitor) {
visitor.visit(this);
}
}
/**
* 2. 創(chuàng)建擴展了上述類的實體類铝条。
* @author mazaiting
*/
public class Monitor implements ComputerPart{
public void accept(ComputerPartVisitor visitor) {
visitor.visit(this);
}
}
/**
* 2. 創(chuàng)建擴展了上述類的實體類。
* @author mazaiting
*/
public class Mouse implements ComputerPart{
public void accept(ComputerPartVisitor visitor) {
visitor.visit(this);
}
}
- 定義一個表示訪問者的接口席噩。
/**
* 3. 定義一個表示訪問者的接口班缰。
* @author mazaiting
*/
public interface ComputerPartVisitor {
/*public void visit(Computer computer);
public void visit(Mouse mouse);
public void visit(Keyboard keyboard);
public void visit(Monitor monitor);*/
public <T> void visit(T t);
}
- 創(chuàng)建實現(xiàn)了上述類的實體訪問者。
/**
* 4. 創(chuàng)建實現(xiàn)了上述類的實體訪問者悼枢。
* @author mazaiting
*/
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
public <T> void visit(T t) {
System.out.println(t.getClass().getName());
}
/*public void visit(Computer computer) {
System.out.println("Displaying Computer.");
}
public void visit(Mouse mouse) {
System.out.println("Displaying Mouse.");
}
public void visit(Keyboard keyboard) {
System.out.println("Displaying Keyboard.");
}
public void visit(Monitor monitor) {
System.out.println("Displaying Monitor.");
}*/
}
- 使用 ComputerPartDisplayVisitor 來顯示 Computer 的組成部分埠忘。
/**
* 5. 使用 ComputerPartDisplayVisitor 來顯示
* Computer 的組成部分。
* @author mazaiting
*/
public class Client {
public static void main(String[] args) {
ComputerPart computer = new Computer();
computer.accept(new ComputerPartDisplayVisitor());
}
}
- 打印結果
com.mazaiting.visitor.Computer