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发送信息'); // 发送失败未找到用户

猜你喜欢

转载自my.oschina.net/u/3529405/blog/1824362