php 设计模式之 中介者
1. 中介者模式
用一个中介者对象来封装一系列的对象交互
,使各对象不需要显式地相互引用从而使其耦合松散,而且可以独立地改变它们之间的交互
2. 实列
abstract class Mediator {
abstract public function Send($message, $user);
}
class ChatMediator extends Mediator { // 中介
public $users = [];
public function Attach($user) {
if (!in_array($user, $this->users)) {
$this->users[] = $user;
}
}
public function Detach($user) { // 除了当前元素,通知其他元素
$position = 0;
foreach ($this->users as $u) {
if ($u == $user) {
unset($this->users[$position]);
}
$position++;
}
}
public function Send($message, $user) { // 除了当前元素,通知其他元素
foreach ($this->users as $u) {
if ($u == $user) {
continue;
}
$u->Notify($message);
}
}
}
abstract class User {
public $mediator;
public $name;
public function __construct($mediator, $name) {
$this->mediator = $mediator;
$this->name = $name;
}
}
class ChatUser extends User {
public function Send($message) {
$this->mediator->Send($message . '(' . $this->name . '发送)', $this);
}
public function Notify($message) {
echo $this->name . '收到消息:' . $message, PHP_EOL;
}
}
$m = new ChatMediator(); // 中介
$u1 = new ChatUser($m, '用户1');
$u2 = new ChatUser($m, '用户2');
$u3 = new ChatUser($m, '用户3');
$m->Attach($u1);
$m->Attach($u3);
$m->Attach($u2);
$u1->Send('Hello, 大家好呀!'); // 用户2、用户3收到消息
$u2->Send('你好呀!'); // 用户1、用户3收到消息
$m->Detach($u2); // 用户2退出聊天室
$u3->Send('欢迎欢迎!'); // 用户1收到消息