訪問者模式就是針對不一樣的資源設置不一樣的訪問權限, 反轉這訪問權限的設置位置,從而達到不修改資源來控制訪問權限的目的.java
public class unionLevel { public String getLevelName(unionVisitor visitor){ return "see union level"; }; } public interface unionVisitor { /** * 看第一級素材 * @return */ default String seeLevelOne(unionLevel level){ return level+" forbidden"; } /** * level two * @return */ default String seeLevelTwo(unionLevel level){ return level+" forbidden"; } /** * level three * @return */ default String seeLevelThree(unionLevel level) { return level+" forbidden"; } }
public class LevelOne extends unionLevel{ @Override public String getLevelName(unionVisitor visitor) { System.out.println(visitor.seeLevelOne(this)); return super.getLevelName(visitor); } @Override public String toString() { return "levelone"; } }
public class VisitorOne implements unionVisitor{ /** * 看第一級素材 * * @return */ @Override public String seeLevelOne(unionLevel level) { return "VisitorOne can see "+level; } }
public class start { public static void main(String[] args) { LevelTwo two = new LevelTwo(); two.getLevelName(new VisitorOne()); two.getLevelName(new VisitorTwo()); two.getLevelName(new VisitorThree()); } }
日常不怎麼喜歡寫總結的,可是說要是使用的時候仍是會去翻一下他的定義。以避免本身弄錯了都不知道,其實對於訪問者模式來講,最大的好處就是對權限這邊的解放(不過你要是資源級別會隨意變更而權限設置不會隨便變更的話,能夠將這個設計反過來。畢竟設計是死的而人是活的。確定要寫成對實現更加方便的代碼出來)設計模式
是23種基本設計模式中的一種,屬於行爲型設計模式。維基百科定義:Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.(表示要在對象結構的元素上執行的操做。訪問者可以讓您定義新操做,而無需更改其所操做元素的類)app
Use the Visitor pattern whenide
the classes defining the object structure rarely change, but you often want to define new operations over the structure. Changing the object structure classes requires redefining the interface to all visitors, which is potentially costly. If the object structure classes change often, then it's probably better to define the operations in those classes測試
在如下狀況下使用訪問者模式 * 一個對象結構包含許多具備不一樣接口的對象類,而且您但願根據這些對象的具體類對這些對象執行操做 * 須要對對象結構中的對象執行許多不一樣且不相關的操做,而且您要避免使用這些操做「污染」它們的類。訪客能夠經過在一個類中定義相關操做來將它們保持在一塊兒。 * 當許多應用程序共享對象結構時,請使用Visitor將操做僅放在須要它們的應用程序中 定義對象結構的類不多更改,可是您常常想在該結構上定義新的操做。更改對象結構類須要從新定義全部訪問者的接口,這可能會致使成本高昂。若是對象結構類常常更改,那麼最好在這些類中定義操做