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收到消息
posted @ 2020-12-31 13:00  linsonga  阅读(58)  评论(0编辑  收藏  举报