訪問者模式(visitor):java
把數據結構和做用於結構上的操做解耦合,使得操做集合可相對自由地演化。
訪問者模式應用的場景:算法
適用於數據結構相對穩定算法又易變化的系統,把數據結構和算法解耦。
訪問者模式的優勢:數據結構
增長操做很容易,由於增長操做意味着增長新的訪問者。 訪問者模式將有關行爲集中到一個訪問者對象中,其改變不影響系統數據結構。
訪問者模式的缺點:數據結構和算法
增長新的數據結構很困難。
簡單歸納訪問者模式:ide
是一種分離對象數據結構與行爲的方法,經過這種分離,可達到爲一個被訪問者動態添加新的操做而無需作其它的修改的效果。
示例:測試
訪問者模式測試類VisitorTest.javathis
/** * 訪問者模式測試類 * * @author Kevin * @date 2016-3-16 */ public class VisitorTest { public static void main(String[] args) { Visitor visitor = new VisitorImpl(); Subject subject = new SubjectImpl(); subject.accept(visitor); } }
主題接口類Subject.javacode
/** * 主題接口 * * @author Kevin * @date 2016-3-16 */ public interface Subject { /** * 更新主題 * * @author Kevin * @param visitor 訪問者 */ void accept(Visitor visitor); /** * 獲取主題 * * @author Kevin * @return 主題名稱 */ String getSubject(); }
訪問接口類Visitor.java對象
/** * 訪問接口 * * @author Kevin * @date 2016-3-16 */ public interface Visitor { /** * 訪問主題 * * @author Kevin * @param subject 主題 */ void visit(Subject subject); }
具體的主題類SubjectImpl.java接口
/** * 具體的主題 * * @author Kevin * @date 2016-3-16 */ public class SubjectImpl implements Subject { @Override public void accept(Visitor visitor) { visitor.visit(this); } @Override public String getSubject() { return "love"; } }
具體的訪問者類VisitorImpl.java
/** * 具體的訪問者 * * @author Kevin * @date 2016-3-16 */ public class VisitorImpl implements Visitor { @Override public void visit(Subject subject) { System.out.println("visit the subject: " + subject.getSubject()); } }