日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

PHP草根论之设计模式-訪问者模式

發布時間:2025/6/15 php 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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草根论之设计模式-訪问者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。