PHP設計模式 訪問者模式

2021-09-23 00:19:50 字數 3029 閱讀 7627

宣告:本系列部落格參考資料《大話設計模式》,作者程杰。

訪問者模式

表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。

uml類圖:  

角色:        

1.抽象訪問者

(state):

為該物件結構中具體元素角色宣告乙個訪問操作介面。該操作介面的名字和引數標識了傳送訪問請求給具體訪問者的具體元素角色,這樣訪問者就可以通過該元素角色的特定介面直接訪問它。

2.具體訪問者

(success):

實現訪問者宣告的介面。

3.抽象元素

(person):

定義乙個接受訪問操作

accept()

,它以乙個訪問者作為引數。

4. 具體元素

(man):

實現了抽象元素所定義的接受操作介面。

5.結構物件

(objectstruct

):這是使用訪問者模式必備的角色。它具備以下特性:

能列舉它的元素;可以提供乙個高層介面以允許訪問者訪問它的元素;如有需要,可以設計成乙個復合物件或者乙個聚集(如乙個列表或無序集合)。

核心**:

<?php 

/** * created by phpstorm.

* user:jang

* date:2015/6/11

* tim: 9 :40

*//*男人這本書的內容要比封面吸引人;女人這本書的封面通常比內容更吸引人

男人成功時,背後多半有乙個偉大的女人;女人成功時,背後多半有乙個失敗的男人

男人失敗時,悶頭喝酒,誰也不用勸;女人失敗時,眼淚汪汪,誰也勸不了

男人戀愛時,凡事不懂也要裝懂;女人戀愛時,遇事懂也要裝作不懂*/

//抽象狀態

abstract class state

//抽象人

abstract class person

//成功狀態

class success extends state

public function getmanaction(vman $elementm)

:時,背後多半有乙個偉大的女人。

"; }

public function getwomanaction(vwoman $elementw)

:時,背後大多有乙個不成功的男人。

"; }

}//失敗狀態

class failure extends state

public function getmanaction(vman $elementm)

:時,悶頭喝酒,誰也不用勸。

"; }

public function getwomanaction(vwoman $elementw)

:時,眼淚汪汪,誰也勸不了。

"; }

}//戀愛狀態

class amativeness extends state

public function getmanaction(vman $elementm)

:時,凡事不懂也要裝懂。

"; }

public function getwomanaction(vwoman $elementw)

:時,遇事懂也要裝作不懂。

"; }

}//男人

class vman extends person

public function accept(state $visitor)

}//女人

class vwoman extends person

public function accept(state $visitor)

}//物件結構

class objectstruct

//移除

public function remove(person $element)}}

//檢視顯示

public function display(state $visitor)}}

測試客戶端**:

header("content-type:text/html;charset=utf-8");

//------------------------訪問者模式--------------------

require_once "./visitor/visitor.php";

$os = new objectstruct();

$os->add(new vman());

$os->add(new vwoman());

//成功時反應

$ss = new success();

$os->display($ss);

//失敗時反應

$fs = new failure();

$os->display($fs);

//戀愛時反應

$ats=new amativeness();

$os->display($ats);

適用場景及優勢:

1) 乙個物件結構包含很多類物件,它們有不同的介面,

而你想對這些物件實施一些依賴於其具體類的操作。

2) 需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而你想避免讓這些操作「汙染」這些物件的類。

visitor

模式使得你可以將相關的操作集中起來定義在乙個類中。

3) 當該物件結構被很多應用共享時,用

visitor

模式讓每個應用僅包含需要用到的操作。

4) 定義物件結構的類很少改變,但經常需要在此結構上定義新的操作。改變物件結構類需要重定義對所有訪問者的介面,這可能需要很大的代價。如果物件結構類經常改變,那麼可能還是在這些類中定義這些操作較好。

php物件導向設計模式

PHP設計模式 訪問者模式

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

php 設計模式 之 訪問者模式

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

設計模式 訪問者模式

訪問者模式是一種資料操作與資料結構分離的設計模式,訪問者模式的基本想法是,軟體系統中擁有乙個由許多物件構成的 比較穩定的物件結構,這些物件的類都擁有乙個accept方法用來接受訪問者物件的訪問。訪問者是乙個介面,它擁有乙個visit方法,這個方法對訪問到的物件結構中不同型別的元素作出不同的處理。在物...