原文地址:http://www.work100.net/training/monolithic-architecture-design-patterns-visitor-pattern.html
更多教程:光束雲 - 免費課程html
序號 | 文內章節 | 視頻 |
---|---|---|
1 | 概述 | - |
2 | 實現 | - |
請參照如上章節導航
進行閱讀java
在訪問者模式(Visitor Pattern
)中,咱們使用了一個訪問者類,它改變了元素類的執行算法。
經過這種方式,元素的執行算法能夠隨着訪問者改變而改變。
這種類型的設計模式屬於行爲型模式。
根據模式,元素對象已接受訪問者對象,這樣訪問者對象就能夠處理元素對象上的操做。算法
意圖:設計模式
主要將數據結構與數據操做分離。數據結構
主要解決:架構
穩定的數據結構和易變的操做耦合問題。ide
什麼時候使用:this
須要對一個對象結構中的對象進行不少不一樣的而且不相關的操做,而須要避免讓這些操做"污染"這些對象的類,使用訪問者模式將這些封裝到類中。.net
如何解決:設計
在被訪問的類裏面加一個對外提供接待訪問者的接口。
關鍵代碼:
在數據基礎類裏面有一個方法接受訪問者,將自身引用傳入訪問者。
應用實例:
您在朋友家作客,您是訪問者,朋友接受您的訪問,您經過朋友的描述,而後對朋友的描述作出一個判斷,這就是訪問者模式。
優勢:
缺點:
使用場景:
注意事項:
訪問者能夠對功能進行統一,能夠作報表、UI、攔截器與過濾器。
咱們將建立一個定義接受操做的 ComputerPart
接口。
Keyboard
、Mouse
、Monitor
和 Computer
是實現了 ComputerPart
接口的實體類。
咱們將定義另外一個接口 ComputerPartVisitor
,它定義了訪問者類的操做。
Computer
使用實體訪問者來執行相應的動做。
VisitorPatternDemo
,咱們的演示類使用 Computer
、ComputerPartVisitor
類來演示訪問者模式的用法。
定義一個表示元素的接口。
ComputerPart.java
,代碼以下:
public interface ComputerPart { void accept(ComputerPartVisitor computerPartVisitor); }
建立擴展了上述類的實體類。
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); } }
定義一個表示訪問者的接口。
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); }
建立實現了上述類的實體訪問者。
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."); } }
使用 ComputerPartDisplayVisitor
來顯示 Computer
的組成部分。
VisitorPatternDemo.java
,代碼以下:
public class VisitorPatternDemo { public static void main(String[] args) { ComputerPart computer = new Computer(); computer.accept(new ComputerPartDisplayVisitor()); } }
執行程序,輸出結果:
Displaying Mouse. Displaying Keyboard. Displaying Monitor. Displaying Computer.
上一篇:模板模式
若是對課程內容感興趣,能夠掃碼關注咱們的
公衆號
或QQ羣
,及時關注咱們的課程更新