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

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

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

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

(二)訪問者模式 UML圖

Visitor Pattern

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

Visitor Pattern

(三)簡(jiǎn)單實(shí)例

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

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

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

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

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

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