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