訪問者模式是一種將演算法與物件結構分離的軟體設計模式,它可以讓你在不修改物件結構的情況下,對物件結構中的元素進行不同的操作,訪問者模式的優點是符合單一職責原則,優秀的擴展性和靈活性,缺點是具體元素對訪問者公布細節,違反了迪米特原則,而且如果元素類經常變化,會導致訪問者類需要頻繁修改,
訪問者模式適合在以下場景下使用:
- 物件結構比較穩定,但經常需要在此物件結構上定義新的操作,
- 需要對一個物件結構中的物件進行很多不同的并且不相關的操作,而需要避免讓這些操作“污染”這些物件的類,也不希望在增加新操作時修改這些類,
- 物件結構中的元素型別很少變化,但每個元素都有很多種變化的可能性,并且每一種變化都影響到元素的行為,
一個訪問者模式的例子,
這個例子中,有一個計算機組件的介面(ComputerPart),它有一個accept方法用來接受訪問者物件(ComputerPartVisitor),
然后有三個實作了這個介面的類:鍵盤(Keyboard),滑鼠(Mouse)和顯示幕(Monitor),
每個類都實作了accept方法,呼叫訪問者物件的visit方法,并傳遞自身作為引數,
訪問者物件是一個介面,它有三個visit方法,分別對應三種不同的計算機組件,然后有兩個實作了這個介面的類:計算機顯示訪問者(ComputerDisplayVisitor)和計算機修理訪問者(ComputerRepairVisitor),
每個類都實作了三個visit方法,分別對不同的計算機組件執行不同的操作,
最后,有一個計算機類(Computer),它包含了三種計算機組件,并且也實作了accept方法,呼叫每個組件的accept方法,并傳遞自身作為引數,下面是部分代碼:
// 計算機組件介面 public interface ComputerPart { public void accept(ComputerPartVisitor computerPartVisitor); } // 鍵盤類 public class Keyboard implements ComputerPart { @Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } } // 滑鼠類 public class Mouse implements ComputerPart { @Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } } // 顯示幕類 public class Monitor implements ComputerPart { @Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } } // 訪問者介面 public interface ComputerPartVisitor { public void visit(Keyboard keyboard); public void visit(Mouse mouse); public void visit(Monitor monitor); } // 計算機顯示訪問者類 public class ComputerDisplayVisitor implements ComputerPartVisitor { @Override public void visit(Keyboard keyboard) { System.out.println("Displaying Keyboard."); } @Override public void visit(Mouse mouse) { System.out.println("Displaying Mouse."); } @Override public void visit(Monitor monitor) { System.out.println("Displaying Monitor."); } } // 計算機修理訪問者類 public class ComputerRepairVisitor implements ComputerPartVisitor { @Override public void visit(Keyboard keyboard) { System.out.println("Repairing Keyboard."); } @Override public void visit(Mouse mouse) { System.out.println("Repairing Mouse."); } @Override public void visit(Monitor monitor) { System.out.println("Repairing Monitor."); } } // 計算機類 public class Computer implements ComputerPart { private final List<ComputerComponent> components; // 建構式初始化鍵盤、滑鼠和顯示幕 // 實作accept方法 // 呼叫每個組件的accept方法,并傳遞自身作為引數 }
這段代碼的目的是演示訪問者模式的用法,它定義了一個計算機組件的介面,和三個實作了這個介面的類,分別代表鍵盤、滑鼠和顯示幕,這些類都有一個accept方法,用來接受一個訪問者物件,并呼叫它的visit方法,訪問者物件是一個介面,它有三個visit方法,分別對應三種不同的計算機組件,這個介面有兩個實作類,分別是計算機顯示訪問者和計算機修理訪問者,這兩個類都實作了三個visit方法,分別對不同的計算機組件執行不同的操作,例如,計算機顯示訪問者會列印出每個組件的名稱,而計算機修理訪問者會列印出每個組件正在被修理,最后,有一個計算機類,它包含了三種計算機組件,并且也實作了accept方法,當呼叫這個方法時,它會遍歷所有的組件,并呼叫它們的accept方法,并傳遞自身作為引數,這樣就可以根據不同的訪問者物件,在不修改原有類結構和行為的情況下,對每個組件執行不同的操作,
假設我們創建了一個計算機物件,然后分別用計算機顯示訪問者和計算機修理訪問者來訪問它,那么運行結果可能是這樣的:
// 創建一個計算機物件 Computer computer = new Computer(); // 創建一個計算機顯示訪問者物件 ComputerDisplayVisitor displayVisitor = new ComputerDisplayVisitor(); // 呼叫計算機的accept方法,并傳遞顯示訪問者物件 computer.accept(displayVisitor); // 輸出結果: Displaying Keyboard. Displaying Mouse. Displaying Monitor. // 創建一個計算機修理訪問者物件 ComputerRepairVisitor repairVisitor = new ComputerRepairVisitor(); // 呼叫計算機的accept方法,并傳遞修理訪問者物件 computer.accept(repairVisitor); // 輸出結果: Repairing Keyboard. Repairing Mouse. Repairing Monitor.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/545774.html
標籤:其他
上一篇:SpringCloud微服務實戰——搭建企業級開發框架(四十九):資料字典注解的設計與實作
下一篇:訂單超時怎么處理?我們用這種方案
