訪問者模式(visitor pattern):在不改變某物件結構中元素的前提下,定義作用於這些元素的新操作。
訪問者模式適用於資料結構相對穩定的系統,可以把資料結構和作用於結構上的操作解耦,使操作集合可以相對自由地變化。一種操作就相當於乙個訪問者。訪問者模式將有關操作行為集中到乙個訪問者物件中。
訪問者模式的缺點在於會使資料結構的變化變得困難。
比如男人和女人對於不同的事件有不同的反應,如果單純抽象出person基類,man和woman根據傳遞進來的不同事件作出不同反應,這樣新增事件的話都要修改man和woman,違反了封閉開放原則。
可以把變化的地方,也就是不同的事件,抽象乙個基類,然後基於這個基類進行擴充套件,可以達到比較好的解耦效果。
首先定義資料基類,基本方法就是對事件進行反應:
public
inte***ce person
兩個資料類,訪問者模式一般應用於資料元素比較穩定的情況下:
class
manimplements
person
}class
woman
implements
person
}
此處用到乙個技術叫雙分派,就是在資料物件的乙個方法中,接收事件物件作為引數,這是一次分派;然後接收到的事件物件呼叫自己的方法,傳入呼叫它的資料物件作為方法引數,這就是第二次分派。雙分派技術意味著方法的執行不僅取決於方法引數,還取決於執行方法的物件,由方法引數和呼叫者本身共同決定執行結果。
然後定義事件類,也就是模式裡的訪問者,事件類就是定義資料類各自的反應方法,如果資料元素穩定不變的話,事件類的方法也就不用去修改:
public
inte***ce event
事件類的具體實現:
class
success
implements
event
@override
public
void getwomanreaction(woman woman)
}class
failure
implements
event
@override
public
void getwomanreaction(woman woman)
}class
marriage
implements
event
@override
public
void getwomanreaction(woman woman)
}
然後我們還可以定義乙個資料結構,用來組織資料元素對於不同訪問者的反應結果:
public
class datastructure
public
void
removeelement(person element)
public
void
showreaction(event visitor)
}}
測試類:
public
class main
}
輸出:
man success時,背後一般有個偉大的女人
woman success時,背後一般有個不成功的男人
man failure時,獨自借酒澆愁
woman failure時,需要人來安慰
man marriage時,我會照顧你一輩子
woman marriage時,我願意和你到天荒地老
訪問者模式使得資料元素不變的情況下,新增事件只要建立新的實現即可,不用修改原有**,很好地符合了封閉開放原則。 設計模式之訪問者模式
先看一下下面這段 class person public string getaction public void setaction string action public void getconclusion else if action exciting else if action gri...
設計模式之訪問者模式
我們去銀行櫃檯辦業務,一般情況下會開幾個個人業務櫃檯的,你去其中任何乙個櫃檯辦理都是可以的。我們的訪問者模式可以很好付諸在這個場景中 對於銀行櫃檯來說,他們是不用變化的,就是說今天和明天提供個人業務的櫃檯是不需要有變化的。而我們作為訪問者,今天來銀行可能是取消費流水,明天來銀行可能是去辦理手機銀行業...
設計模式之訪問者模式
定義 表示一介作用於某個物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。結構圖 示例 public inte ce vistor public class concretevisitor1 implements vistor override public ...