PHP草根论之设计模式-訪问者模式
關于模式本身的概念,請參考網上其他文章
此處僅僅討論在PHP實際開發過程中的應用
此模式適用范圍極為受限,適用情景:
1.適用于項目維護過程,不適用于項目開發過程
2.新增需求,要求為一個/多個類添加一個/多個,同樣/相似的方法
3.原有代碼不能改動或擴展
4.原有類已經預留了一個為本模式準備的接口.
以上,3,4非常難同一時候在產品維護過程中同一時候出現.
?
需求:
1.一組對象,同屬一個父類或分屬不同父類,使用某一數據結構組成一個數據集,此處的數據結構能夠是概念意義上的隊列,棧,集合,樹,圖或實際意義上的一維或多維數組,僅僅要能夠遍歷就可以
2.項目須要對以上對象添加一個操作,以便在遍歷整組對象時,同名調用.
?
實現過程:
1.原有代碼中,以上對象所屬的類,事先預留了一個擴展接口,能夠叫做accept(奇怪的名字)
Class ElementA{
public function accept(VisitorBase $v){
$v->visitA($this);
}
}
class ElementB{
public function accept(VisitorBase $v){
$v->visitB($this);
}
?
}
依據以上,我們當然要事先定義一個VisitorBase的抽象接口
interface VisitorBase {
function visitA(ElementA $eleA);
function visitB(ElementB $eleB);
}
2.新的代碼中,我們為新增的操作創建一個類,叫做VisitorX(訪問者,又是一個奇怪的名稱),假設有還有一個操作,能夠定義為VisitorY,均實現了VisitorBase接口
class VisitorX implements VisitorBase{
public function visitA(ElementA $eleA){
//此處能夠訪問元素A的方法以處理詳細事務
$eleA->someFunc();
}
public function visitB(ElementB $eleB){
……
}
}
3.新的代碼中,我們能夠遍歷,以數組為例(這個最經常使用了)
??? $x=new VisitorX;
??? foreach($elementArray as $element){
??????? $element->accept($x);
??? }
??? 以上將遍歷全部元素(不管是否同一父類),對每個元素運行VisitorX類中的對應操作.
草根觀點:
??? 1.憑什么原有代碼不讓改動?僅僅是加個方法而已.
??? 2.我不改原有代碼,還不讓我繼承一下,擴展一個方法?
??? 3.原有代碼定義擴展接口了么?
曾經的程序猿有這么前瞻?
??? 4.僅僅要有其他方式實現同等功能,盡量不要使用此設計模式, 這將導致對同一對象的操作代碼分散在程序的不同位置,不利于進一步的維護與改動.
??? 5.可考慮的替代實現方法:
?????? A.改動原有類,添加一個同名方法
?????? B.擴展(繼承)原有類,添加一個同名方法
?????? C.假設一定要將不同類的同一操作的代碼集中在一起,那么考慮Trait吧
總結
以上是生活随笔為你收集整理的PHP草根论之设计模式-訪问者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决visual studio已安装的问
- 下一篇: python性能分析