PHP草根論之設計模式 訪問者模式

2021-09-07 04:30:54 字數 1483 閱讀 5467

關於模式本身的概念,請參考網上其他文章

此處僅僅討論在php實際開發過程中的應用

此模式適用範圍極為受限

,適用情景:

1.適用於專案維護過程

,不適用於專案開發過程

2.新增需求

,要求為乙個

/多個類新增乙個/多個

,同樣/相似的方法

3.原有**不能改動或擴充套件

4.原有類已經預留了乙個為本模式準備的介面.

以上,3,4

非常難同一時候在產品維護過程中同一時候出現.

需求:

1.一組物件

,同屬乙個父類或分屬不同父類

,使用某一資料結構組成乙個資料集

,此處的資料結構能夠是概念意義上的佇列,棧

,集合,樹

,圖或實際意義上的一維或多維陣列

,僅僅要能夠遍歷就可以

2.專案須要對以上物件新增乙個操作

,以便在遍歷整組物件時

,同名呼叫.

實現過程:

1.原有**中

,以上物件所屬的類

,事先預留了乙個擴充套件介面

,能夠叫做

accept(

奇怪的名字)

class elementa

}class elementb

}依據以上

,我們當然要事先定義乙個

visitorbase

的抽象介面

inte***ce visitorbase

2.新的**中

,我們為新增的操作建立乙個類,叫做

visitorx(

訪問者,

又是乙個奇怪的名稱

),假設有還有乙個操作

,能夠定義為

visitory,

均實現了

visitorbase介面

class visitorx implements visitorbase

public function visitb(elementb $eleb)

}3.新的**中,我們能夠遍歷,以陣列為例(這個最經常使用了)

$x=new visitorx;

foreach($elementarray as $element)

以上將遍歷全部元素(不管是否同一父類),對每個元素執行visitorx類中的對應操作.

草根觀點:

1.憑什麼原有**不讓改動?僅僅是加個方法而已.

2.我不改原有**,還不讓我繼承一下,擴充套件乙個方法?

3.原有**定義擴充套件介面了麼?

曾經的程式猿有這麼前瞻?

4.僅僅要有其他方式實現同等功能,盡量不要使用此設計模式, 這將導致對同一物件的操作**分散在程式的不同位置,不利於進一步的維護與改動.

5.可考慮的替代實現方法:

a.改動原有類,新增乙個同名方法

b.擴充套件(繼承)原有類,新增乙個同名方法

c.假設一定要將不同類的同一操作的**集中在一起,那麼考慮trait吧

php 設計模式 之 訪問者模式

訪問者模式實際上是讓外部類能夠獲取樹形結構的每個節點的物件,對每個物件進行操作的模式,他能讓我們在不改動原有樹形結構的基礎上擴充套件功能。比如統計等等 在這種模式下,必須有的幾個要素 1 具體的元素物件,訪問者實際要訪問的位置 即節點 2 穩定的樹形結構,每個節點都是乙個元素物件,一般在組合模式下比...

PHP設計模式 訪問者模式

宣告 本系列部落格參考資料 大話設計模式 作者程杰。訪問者模式 表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。uml類圖 角色 1.抽象訪問者 state 為該物件結構中具體元素角色宣告乙個訪問操作介面。該操作介面的名字和引數標識了傳送訪問請...

PHP設計模式 訪問者模式

訪問者模式 visitor 表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。抽象訪問者 class visitorstate abstract class visitorstate 抽象類,定義乙個accept操作 class element...