原文位址: http://www.work100.net/training/monolithic-architecture-design-patterns-visitor-pattern.html 更多教程: 光束雲 - 免費課程
通路者模式
請參照如上
章節導航
進行閱讀
1.概述
在通路者模式(
Visitor Pattern
)中,我們使用了一個通路者類,它改變了元素類的執行算法。
通過這種方式,元素的執行算法可以随着通路者改變而改變。
這種類型的設計模式屬于行為型模式。
根據模式,元素對象已接受通路者對象,這樣通路者對象就可以處理元素對象上的操作。
意圖:
主要将資料結構與資料操作分離。
主要解決:
穩定的資料結構和易變的操作耦合問題。
何時使用:
需要對一個對象結構中的對象進行很多不同的并且不相關的操作,而需要避免讓這些操作"污染"這些對象的類,使用通路者模式将這些封裝到類中。
如何解決:
在被通路的類裡面加一個對外提供接待通路者的接口。
關鍵代碼:
在資料基礎類裡面有一個方法接受通路者,将自身引用傳入通路者。
應用執行個體:
您在朋友家做客,您是通路者,朋友接受您的通路,您通過朋友的描述,然後對朋友的描述做出一個判斷,這就是通路者模式。
優點:
- 符合單一職責原則。
- 優秀的擴充性。
- 靈活性。
缺點:
- 具體元素對通路者公布細節,違反了迪米特原則。
- 具體元素變更比較困難。
- 違反了依賴倒置原則,依賴了具體類,沒有依賴抽象。
使用場景:
- 對象結構中對象對應的類很少改變,但經常需要在此對象結構上定義新的操作。
- 需要對一個對象結構中的對象進行很多不同的并且不相關的操作,而需要避免讓這些操作"污染"這些對象的類,也不希望在增加新操作時修改這些類。
注意事項:
通路者可以對功能進行統一,可以做報表、UI、攔截器與過濾器。
2.實作
我們将建立一個定義接受操作的
ComputerPart
接口。
Keyboard
、
Mouse
Monitor
和
Computer
是實作了
ComputerPart
接口的實體類。
我們将定義另一個接口
ComputerPartVisitor
,它定義了通路者類的操作。
Computer
使用實體通路者來執行相應的動作。
VisitorPatternDemo
,我們的示範類使用
Computer
ComputerPartVisitor
類來示範通路者模式的用法。
步驟 1
定義一個表示元素的接口。
ComputerPart.java
,代碼如下:
public interface ComputerPart {
void accept(ComputerPartVisitor computerPartVisitor);
}
步驟 2
建立擴充了上述類的實體類。
Keyboard.java
public class Keyboard implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
Monitor.java
public class Monitor implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
Mouse.java
public class Mouse implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
Computer.java
public class Computer implements ComputerPart {
ComputerPart[] parts;
public Computer(){
parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};
}
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
for (int i = 0; i < parts.length; i++) {
parts[i].accept(computerPartVisitor);
}
computerPartVisitor.visit(this);
}
}
步驟 3
定義一個表示通路者的接口。
ComputerPartVisitor.java
public interface ComputerPartVisitor {
public void visit(Computer computer);
public void visit(Mouse mouse);
public void visit(Keyboard keyboard);
public void visit(Monitor monitor);
}
步驟 4
建立實作了上述類的實體通路者。
ComputerPartDisplayVisitor.java
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
@Override
public void visit(Computer computer) {
System.out.println("Displaying Computer.");
}
@Override
public void visit(Mouse mouse) {
System.out.println("Displaying Mouse.");
}
@Override
public void visit(Keyboard keyboard) {
System.out.println("Displaying Keyboard.");
}
@Override
public void visit(Monitor monitor) {
System.out.println("Displaying Monitor.");
}
}
步驟 5
使用
ComputerPartDisplayVisitor
來顯示
Computer
的組成部分。
VisitorPatternDemo.java
public class VisitorPatternDemo {
public static void main(String[] args) {
ComputerPart computer = new Computer();
computer.accept(new ComputerPartDisplayVisitor());
}
}
步驟 6
執行程式,輸出結果:
Displaying Mouse.
Displaying Keyboard.
Displaying Monitor.
Displaying Computer.
上一篇:
模闆模式如果對課程内容感興趣,可以掃碼關注我們的或
公衆号
,及時關注我們的課程更新
QQ群