訪問者模式(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的真正一部分。