訪問者模式實際上是讓外部類別能夠獲取樹形結構的每個節點的對象,對每個對象進行操作的模式,它讓我們在不改動原有樹形結構的基礎上擴展功能,例如統計等等。
在這種模式下,必須有的幾個要素:
1、具體的元素對象,訪客實際要訪問的位置(即節點)
2、穩定的樹形結構,每個節點都是一個元素對象,一般在組合模式下比較多,它提供給了讓訪問者能夠進行訪問的實際位置(即訪問者訪問的是具體的屬性結構的某個節點的實例化對象);
3、訪問者接口,這裡定義了訪問者的接口方法,這是個在每個節點都會用到的方法;用以節點處引用訪問者,從而使得訪問者能夠訪問當前節點。
4、訪客的具體實現,繼承了訪問者接口,以實現接口方法
//定义元素接口 abstract class User { public function getPoint() { return rand();//改数据应该由数据库中读取,这里就直接模拟某个值了、 } //这里的accept方法用于把访问者引入,在这个方法里,$visitor访问者可以通过User类获取需要的数据进而进行相应的操作。 abstract function accept(UserVisitor $visitor); } //定义元素接口 class VipUser extends User { //在这里getPoint()具体实现就由接口中实现了 //在这里就把当前对象传递给了visitor访问者,在访问者类的visitVip方法中就能根据$this获取必要的数据进行相应的操作 public function accept(UserVisitor $vitor) { $vitor->visitVip($this); } } class NormalUser extends User { //同上的getPoint()具体实现就由接口中实现了 //同VipUser类中的accept public function accept(UserVisitor $vitor) { $vitor->visitNormal($this); } } //定义访问者接口 abstract class UserVisitor { //访问者必须要实现的访问不同用户的接口方法 abstract function visitVip(User $user); abstract function visitNormal(User $user); } //积分操作的访问者实现 class PointActVisitor extends UserVisitor { public function visitVip(User $user) { echo 'Vip用户+10分<br/>'; } public function visitNormal(User $user) { echo 'Normal用户+5分<br/>'; } } //用户树形结构 class Users { protected $users; public function addUser(User $user) { $this->users[] = $user; } }
以上就介紹了PHP設計模式之訪客模式,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。