PHP 中介者模式

<?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發送信息'); // 發送失敗未找到用戶
相關文章
相關標籤/搜索