Skip to content

访问者模式属于行为模式的一种,他的意图是使对象和数据进行分离,侧重于不同对象的行为,适用于对象结构稳定(很少改变),但是经常需要在对象上定义新的操作的场景或者一个对象包含多个不同类型的对象且每个类型可以有不同的访问操作的场景下使用。

访问者模式的优点在于:

  1. 符合类的开闭原则,新增访问操作十分方便。
  2. 符合类的单一职责原则,将对对象访问的行为集中在一个访问者对象中,而不是分散在一个个类的元素中。

主要缺点在于:

  1. 增加新的访问元素比较困难,需要在每个访问者类中增加相应的访问操作代码----违背了开闭原则。
  2. 元素对象有时候需要暴露一些自己内部分操作和状态,否则无法供访问者访问----破坏了类的封装性。
php
/**
 * 访问者抽象定义
 * Class Visitor
 */
abstract class Visitor
{
    public abstract function work();
}

/**
 * 访问者实现
 * Class VisitConcreteA
 */
class Teacher extends Visitor
{
    public function work()
    {
		//TODO Checking worker etc
        echo 'teacher is checking worker' . PHP_EOL;
    }
}

/**
 * 访问者实现
 * Class VisitConcreteA
 */
class Student extends Visitor
{
    public function work()
    {
		//TODO Writing worker etc
        echo 'student is writing worker' . PHP_EOL;
    }
}

/**
 * 访问者操作抽象
 * Class Element
 */
abstract class Action
{
    public abstract function accept(Visitor $visitor);
}

/**
 * 访问者操作
 * Class ElementConcreteTeacher
 */
class ElementConcreteTeacher extends Action
{
    public function accept(Visitor $visitor)
    {
        $visitor->work();
    }
}

/**
 * 访问者操作
 * Class ElementConcreteStudent
 */
class ElementConcreteStudent extends Action
{
    public function accept(Visitor $visitor)
    {
        $visitor->work();
    }
}

$studentVisitor = new Student();
$student = new ElementConcreteStudent();
$student->accept($studentVisitor);

$teacherVisitor = new Teacher();
$teacher = new ElementConcreteTeacher();
$teacher->accept($teacherVisitor);