<?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發送信息'); // 發送失敗未找到用戶