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