概念:
表示作用于某个对象结构中的各个元素的操作。它使你可以在不改变各个元素类的前提下定义作用于这些元素的操作。
角色:
Vistor:抽象访问者
ConcreteVistor:具体访问者
Element:抽象元素
ConcreteElement:具体元素
ObjectStructure:结构对象
通过树形结构对象ObjectStructure管理具体元素ConcreteElement;
具体访问者ConcreteVistor通过树形结构对象ObjectStructure来访问具体元素ConcreteElement;
具体元素ConcreteElement通过实现抽象元素Element拥有接口来欢迎具体访问者ConcreteVistor;
具体访问者ConcreteVistor实现抽象访问者Visitor接口,来对各个具体元素ConcreteElement声明的操作;
实例:
给不同用户组的用户添加积分。
/**
* 抽象元素
*/
abstract class User
{
public function getPoint()
{
return rand();
}
abstract function accept(UserVisitor $vitor);
}
/**
* 具体元素
*/
class VipUser extends User
{
public function accept(UserVisitor $vitor)
{
$vitor->visitVip($this);
}
}
/**
* 具体元素
*/
class NormalUser extends User
{
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分' . PHP_EOL;
}
public function visitNormal(User $user)
{
echo 'Normal用户+5分 ' . PHP_EOL;
}
}
/**
* 树形结构对象,即元素集合
*/
class Users
{
protected $users = array();
public function addUser(User $user)
{
$this->users[] = $user;
}
public function handleVisitor(UserVisitor $visitor)
{
foreach($this->users as $user) {
$user->accept($visitor);
}
}
}
$pointVisitor = new PointActVisitor();
$users = new Users();
$users->addUser(new VipUser());
$users->addUser(new NormalUser());
$users->addUser(new NormalUser());
/**
* Vip用户+10分
* Normal用户+5分
* Normal用户+5分
*/
$users->handleVisitor($pointVisitor);