PHP設(shè)計模式(二十)—訪問者模式(Visitor Pattern)

訪問者模式(Visitor Pattern) : 表示一個作用于某對象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用于這些元素的新操作。

(一)為什么需要訪問者模式

訪問者模式能夠在不更改對象的情況下向該對象添加新的功能性

(二)訪問者模式 UML圖

Visitor Pattern

訪問者模式UML圖通常是比較復(fù)雜,如果對于只有一個元素和一種訪問者,我們其實也可以不用抽象元素和抽象訪問者,不要objectStruct。
下圖給出《PHP設(shè)計模式》中的訪問者模式UML圖。

Visitor Pattern

(三)簡單實例

由于訪問者模式的復(fù)雜,可能一開始大家看了好久也不知其所然。我也是看了好久都不知道訪問者模式的意思。所以這里我只用《PHP設(shè)計模式》一書中的UML圖,實現(xiàn)如何在不更改對象的情況下向該對象添加新的功能性。

<?php
//具體元素
class Superman{
    public $name;
    public function doSomething(){
        echo '我是超人,我會飛'.PHP_EOL;
    }
    public function accept(Visitor $visitor){
        $visitor->doSomething($this);
    }
}
//具體訪問者
class Visitor{
    public function doSomething($object){
        echo '我可以返老還童到'.$object->age = 18;
    }
}
//實例化具體對象
$man = new Superman;
//使用自己的能力
$man->doSomething();
//通過添加訪問者,把訪問者能能力擴展成自己的
$man->accept(new Visitor);

我們可以看到,通過調(diào)用accept方法接收一個訪問者,具體對象可以把訪問者的doSomething能力也擴展為自己能力。當(dāng)然如果你需要多個擴展能力,你可以有多個訪問者。而accept方法調(diào)用訪問者的dosomething方法時,傳入$this是為了能使用Superman的屬性和方法,使其感覺擴展完就是Superman的真正一部分。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容