<?php /** * 中介者模式 * A与B之间通信通过中间者传递 * 中介者储存并转发内容 * 中介者把自身绑定到A-B共同的父类保存 * 建立AB类 注册到中介类,中介类返回自身给AB类, * AB类-中介类互相绑定 */ /** * Class AUser * 建立用户抽象类 * @param $_mid (用于绑定中介类) * @abstract * @function SendMessage($id,$massage); (用于对指定的用户发送信息) * @function GetMessage($massage);(用于获取其余用户发送的信息) * @public * @function SetMid(AMidService $mid) * (接收一个中间类,并绑定到$_mid的实现) * */ abstract class AUser { protected $_mid; abstract function SendMessage($id,$massage); abstract function GetMessage($massage); public function SetMid(AMidService $mid) { $this->_mid = $mid; } } /** * Class UserA * @function SendMessage($id, $massage) 发送信息 * @function GetMessage($massage) 获取消息 */ class UserA extends AUser { /** * @param $id 接收方id * @param $massage 发送消息文本 */ function SendMessage($id, $massage) { // TODO: Implement SendMessage() method. $this->_mid->Transfer($id,$massage); } /** * @param $massage 接收的信息 */ function GetMessage($massage) { // TODO: Implement GetMessage() method. echo '新的消息'.$massage.PHP_EOL; } } /** * Class UserB * @function SendMessage($id, $massage) 发送信息 * @function GetMessage($massage) 获取消息 */ class UserB extends AUser { /** * @param $id 接收方id * @param $massage 发送消息文本 */ function SendMessage($id, $massage) { // TODO: Implement SendMessage() method. $this->_mid->Transfer($id,$massage); } /** * @param $massage 接收的信息 */ function GetMessage($massage) { // TODO: Implement GetMessage() method. echo '新的消息'.$massage.PHP_EOL; } } /** * Class AMidService * 定义中介类 * @abstract * function Transfer($id,$message) * 提供用户调用 发送信息抽象方法 * function Register($id,AUser $user) * 绑定用户,用户绑定中介调用中介方法实现接收信息 */ abstract class AMidService { abstract public function Transfer($id,$message); abstract public function Register($id,AUser $user); } /** * Class MidService * 中介类具体实现 * @protected static $_mid_service 存放用户绑定信息[用户id]=用户实例 */ class MidService extends AMidService { protected static $_mid_service; /** * MidService constructor. * 若是未设置 转换成数组 */ public function __construct() { isset(self::$_mid_service)?'':self::$_mid_service=[]; } // 转发 /** * @param $id 接收信息用户id * @param $message 发送给指定用户的信息 */ public function Transfer($id, $message) { // 判断是否有此用户 if (!isset(self::$_mid_service[$id])) { echo '发送失败未找到用户'.PHP_EOL; return; } // TODO: Implement Transfer() method. // 用户存在,调用对应用户实例中的GetMessage 发送信息 self::$_mid_service[$id]->GetMessage($message.'接收方'.$id); } // 储存/注册用户 /** * @param $id 用户绑定id * @param AUser $user 用户实例 */ public function Register($id, AUser $user) { // TODO: Implement Register() method. if (!isset(self::$_mid_service[$id])) { self::$_mid_service[$id] = $user; } $user->SetMid($this); // 调用用户实例绑定 中介类(这样才能让用户类调用中介类的接口) } } // 建立用户 $user_a = new UserA(); $user_b = new UserB(); // 建立中介 $mid = new MidService(); // 中介中注册用户 $mid->Register('userA',$user_a); $mid->Register('userB',$user_b); // 向A 用户发送信息 $user_b->SendMessage('userA','hello userA'); // 输出 新的消息hello userA接收方userA // 向B 用户发送信息 $user_a->SendMessage('userB','hello userB'); // 新的消息hello userB接收方userB // 向不存在的C 用户发送信息 $user_b->SendMessage('userC','给不存在的C发送信息'); // 发送失败未找到用户