適用於數據結構相對穩定的系統
例:1. apt(註解處理工具)經過訪問者模式解析註解(參照Think in Java P632);2.大話設計模式中,男人和女人對待不一樣狀態作出不一樣相應的例子php
accept
方法,具體訪問者做爲參數accept
方法中,調用訪問者的方法,並將本身(具體元素)做爲參數傳入Visitor
、ConcreteVisitor
、Element
、ConcreteElement
Element
的實現聲明一個Visit
(訪問)操做,可爲接口或抽象類accept
(接受操做),接受一個訪問者對象做爲參數accept
accept
方法的實現中,直接作一次分派accept
(接受狀態)的方法,會面臨多種狀態:成功、失敗、戀愛、結婚accept
(接受狀態時的反應)。面對狀態,都會作出本身的反應/** * Element(抽象元素):人類 */ public interface Person { /** * 接受狀態 * @param action */ String accept(Action action); }
/** * Action(抽象訪問者):狀態 */ public interface Action { /** * 獲取男人的反應 * @param person * @return */ String GetManConclusion(Man person); /** * 獲取女人反應 * @param person * @return */ String GetManConclusion(Woman person); }
/** * ConcreteElement(抽象訪問者): 男人 */ public class Man implements Person { @Override public String accept(Action action) { // 第二次分派,調用action(訪問者)的方法,把本身(元素自己)做爲參數傳入 return action.GetManConclusion(this); } }
女人java
/** * ConcreteElement(抽象訪問者): 女人 */ public class Woman implements Person { @Override public String accept(Action action) { // 第二次分派,調用action(訪問者)的方法,把本身(元素自己)做爲參數傳入 return action.GetManConclusion(this); } }
/** * ConcreteVisitor(具體訪問者): 成功狀態的響應 */ public class Success implements Action { @Override public String GetManConclusion(Man person) { return "男人成功時,背後總有一個偉大的女人"; } @Override public String GetManConclusion(Woman person) { return "女人成功時,背後大多有一個不成功的男人"; } }
失敗設計模式
/** * ConcreteVisitor(具體訪問者): 失敗狀態的響應 */ public class Failure implements Action { @Override public String GetManConclusion(Man person) { return "男人失敗時,悶頭喝酒,誰也不用勸"; } @Override public String GetManConclusion(Woman person) { return "女人失敗時,眼淚汪汪,誰也勸不了"; } }
戀愛數據結構
/** * ConcreteVisitor(具體訪問者): 戀愛狀態的響應 */ public class Love implements Action{ @Override public String GetManConclusion(Man person) { return "男人戀愛是,凡事不懂也要裝懂"; } @Override public String GetManConclusion(Woman person) { return "女人戀愛時,遇事懂也裝做不懂"; } }
/** * 用來枚舉元素,包含多個元素 */ public class ObjectStructure { private List<Person> elements = new ArrayList<>(); public void add(Person person) { if (null != person) { this.elements.add(person); } } public void del(Person person) { if (null != person) { this.elements.remove(person); } } /** * 獲取並展現元素對指定狀態的響應 * @param action 指定狀態 */ public void accept(Action action) { if (null == this.elements || 0 >= this.elements.size()) { return; } this.elements.forEach(element -> { // 第一次分派,調用元素的接受狀態方法,將action(訪問者)做爲參入 String result = element.accept(action); System.out.println("person: " + element.getClass().getName() + "action: " + action.getClass().getName() + "conclusion: " + result); }); } }