# 访问者模式-PHP
# 男人和女人
<?php
abstract class Action
{
    abstract public function getManConclusion(Man $concreteElementA);
    abstract public function getWomanConclusion(Woman $concreteElementB);
}
abstract class Person
{
    abstract public function accept(Action $visitor);
}
class Success extends Action
{
    public function getManConclusion(Man $concreteElementA)
    {
        echo "背后多半有一个伟大的女人\n";
    }
    public function getWomanConclusion(Woman $concreteElementB)
    {
        echo "背后多半有一个不成功的男人\n";
    }
}
class Failing extends Action
{
    public function getManConclusion(Man $concreteElementA)
    {
        echo "男人失败时,闷头喝酒,谁也不用劝\n";
    }
    public function getWomanConclusion(Woman $concreteElementB)
    {
        echo "女人失败时,眼泪汪汪,谁也劝不了\n";
    }
}
class Amativeness extends Action
{
    public function getManConclusion(Man $concreteElementA)
    {
        echo "男人恋爱时,凡事不懂也要装懂\n";
    }
    public function getWomanConclusion(Woman $concreteElementB)
    {
        echo "女人恋爱时,遇事懂也装作不懂\n";
    }
}
class Man extends Person
{
    public function accept(Action $visitor)
    {
        $visitor->getManConclusion($this);
    }
}
class Woman extends Person
{
    public function accept(Action $visitor)
    {
        $visitor->getWomanConclusion($this);
    }
}
class ObjectStructure
{
    private $person = [];
    public function acctch(Person $person)
    {
        array_push($this->person, $person);
    }
    public function display(Action $visitor)
    {
        foreach ($this->person as $person) {
            $person->accept($visitor);
        }
    }
}
// client
$o = new ObjectStructure();
$o->acctch(new Man()); 
$o->acctch(new Woman());
// 成功时的反应
$v1 = new Success();
$o->display($v1); // 背后多半有一个伟大的女人 背后多半有一个不成功的男人
// 失败时的反应
$v2 = new Failing();
$o->display($v2); // 男人失败时,闷头喝酒,谁也不用劝 女人失败时,眼泪汪汪,谁也劝不了
// 恋爱时的反应
$v3 = new Amativeness();
$o->display($v3); // 男人恋爱时,凡事不懂也要装懂 女人恋爱时,遇事懂也装作不懂
# 动物叫声
动物园有不同的动物,我们要让它们发声。
<?php
// Visitee
interface Animal {
  public function accept(AnimalOperation $operation);
}
// Visitor
interface AnimalOperation {
  public function visitMonkey(Monkey $monkey);
  public function visitLion(Lion $lion);
  public function visitDolphin(Dolphin $dolphin);
}
class Monkey implements Animal {
  public function shout() {
    echo 'Ooh oo aa aa!';
  }
  public function accept(AnimalOperation $operation) {
    $operation->visitMonkey($this);
  }
}
class Lion implements Animal {
  public function roar() {
    echo 'Roaaar!';
  }
  public function accept(AnimalOperation $operation) {
    $operation->visitLion($this);
  }
}
class Dolphin implements Animal {
  public function speak() {
    echo 'Tuut tuttu tuutt!';
  }
  public function accept(AnimalOperation $operation) {
    $operation->visitDolphin($this);
  }
}
class Speak implements AnimalOperation {
  public function visitMonkey(Monkey $monkey) {
    $monkey->shout();
  }
  public function visitLion(Lion $lion) {
    $lion->roar();
  }
  public function visitDolphin(Dolphin $dolphin) {
    $dolphin->speak();
  }
}
// client
$monkey = new Monkey();
$lion = new Lion();
$dolphin = new Dolphin();
$speak = new Speak();
$monkey->accept($speak); // Ooh oo aa aa!
$lion->accept($speak); // Roaaar!
$dolphin->accept($speak); // Tuut tutt tuutt!