# 中介者模式-PHP实现

# 聊天室

用户相互发送消息,而聊天室(中介)负责转发消息。

<?php
interface ChatRoomMediator
{
    public function showMessage(User $user, string $message);
}

// Mediator
class ChatRoom implements ChatRoomMediator
{
    public function showMessage(User $user, string $message)
    {
        $time = date('M d, y H:i');
        $sender = $user->getName();

        echo $time . '[' . $sender . ']:' . $message;
    }
}

class User {
    protected $name;
    protected $chatMediator;

    public function __construct(string $name, ChatRoomMediator $chatMediator) {
        $this->name = $name;
        $this->chatMediator = $chatMediator;
    }

    public function getName() {
        return $this->name;
    }

    public function send($message) {
        $this->chatMediator->showMessage($this, $message);
    }
}

// client
$mediator = new ChatRoom();
$john = new User('John Doe', $mediator);
$jane = new User('Jane Doe', $mediator);

$john->send('Hi there!');
$jane->send('Hey!');

// output will be
// Aug 06, 20 10:33[John Doe]:Hi there!
// Aug 06, 20 10:33[Jane Doe]:Hey!

# 标准例子

中介者模式的标准例子。

<?php
abstract class Mediator {
  abstract public function send($message, Colleague $colleague);
}

abstract class Colleague {
  protected $mediator;

  public function __construct(Mediator $mediator) {
    $this->mediator = $mediator;
  }
}

class ConcreteMediator extends Mediator {
  private $colleague1;
  private $colleague2;

  public function setColleague1(Colleague $colleague) {
    $this->colleague1 = $colleague;
  }

  public function setColleague2(Colleague $colleague) {
    $this->colleague2 = $colleague;
  }

  public function send($message, Colleague $colleague) {
    if ($this->colleague1 == $colleague) {
      $this->colleague2->notify($message);
    } else {
      $this->colleague1->notify($message);
    }
  }
}

class ConcreteColleague1 extends Colleague {
  public function send($message) {
    $this->mediator->send($message, $this);
  }

  public function notify($message) {
    echo "ConcreteColleague1 ".$message."\n";
  }
}

class ConcreteColleague2 extends Colleague {
  public function send($message) {
    $this->mediator->send($message, $this);
  }

  public function notify($message) {
    echo "ConcreteColleague2 ".$message."\n";
  }
}

// client 

$mediator = new ConcreteMediator();
$c1 = new ConcreteColleague1($mediator);
$c2 = new ConcreteColleague2($mediator);

$mediator->setColleague1($c1);
$mediator->setColleague2($c2);

$c1->send('do you eat?');
$c2->send('no, do you want to invite me to dinner?');
最近更新时间: 2020/12/3 17:14:35