实现功能:
1.用户A向用户B打赏金币
2.减少用户A的金币,并写入金币明细表
3.增加用户B的金币,并写入金币明细表
4.给用户B发送一个打赏通知
ps:本文中的同事,并非是指该类为同事,而是沿用中介者模式中的称呼.与中介者打交道的各个类.
一.虚拟同事类:
/**
* Class Colleague
*/
abstract class Colleague
{
protected $mediator;
public function setMediator(Mediator $mediator)
{
$this->mediator = $mediator;
}
}
二.虚拟用户类,继承虚拟同事类
/**
* Class User
*/
abstract class User extends Colleague
{
protected $uid;
protected $money;
public function __construct($uid, $money)
{
$this->uid = $uid;
$this->money = $money;
}
}
三.创建两个同事类:付款方和收款方
1.付款方
class UserPayer extends User
{
public function changeMoney($money)
{
$this->money -= $money;
// 写入明细
$this->mediator->writeMoneyDetail([
‘uid‘ => $this->uid,
‘money‘ => $money,
‘rule‘ => ‘-‘
]);
// 付款给对方
$this->mediator->payee($money);
}
public function getUid()
{
return $this->uid;
}
}
2.收款方
class UserPayee extends User
{
public function changeMoney($money)
{
$this->money += $money;
// 写入明细
$this->mediator->writeMoneyDetail([
‘uid‘ => $this->uid,
‘money‘ => $money,
‘rule‘ => ‘+‘
]);
$attributes = [
‘to_uid‘ => $this->uid,
‘from_uid‘ => $this->mediator->getPayerUid(),
‘money‘ => $money
];
// 增加通知
$this->mediator->notify($attributes);
}
}
四.继续创建同事类:通知类
/**
* 通知类
* Class Notify
*/
class Notify extends Colleague
{
public function writeNotify(array $attribute)
{
echo "用户{$attribute[‘from_uid‘]}向用户{$attribute[‘to_uid‘]}打赏{$attribute[‘money‘]}个金币<br>";
}
}
五.继续创建同事类:金币明细
/**
* 金币明细
* Class MoneyDetial
*/
class MoneyDetial extends Colleague
{
public function writeToDb(array $attribute)
{
echo "UID为{$attribute[‘uid‘]}的用户金币{$attribute[‘rule‘]} {$attribute[‘money‘]}<br>";
}
}
六.中介者类:
/**
* 中介者类
* Class Mediator
*/
class Mediator
{
private $userPayer;
private $userPayee;
private $notify;
private $moneyDetial;
public function __construct(UserPayer $userPayer,
UserPayee $userPayee,
Notify $notify,
MoneyDetial $moneyDetial)
{
$this->userPayer = $userPayer;
$this->userPayee = $userPayee;
$this->notify = $notify;
$this->moneyDetial = $moneyDetial;
}
/**
* 写入明细
* @param array $arributes
*/
public function writeMoneyDetail(array $arributes)
{
$this->moneyDetial->writeToDb($arributes);
}
/**
* 收款
* @param $money
*/
public function payee($money)
{
$this->userPayee->changeMoney($money);
}
/**
* 写入通知
* @param array $attribute
*/
public function notify(array $attribute)
{
$this->notify->writeNotify($attribute);
}
/**
* 获得付款方UID
* @return mixed
*/
public function getPayerUid()
{
return $this->userPayer->getUid();
}
}
七.具体调用
// 创建各个同事类 $userPayer = new UserPayer(1, 100); $userPayee = new UserPayee(2, 200); $notify = new Notify(); $moneyDetial = new MoneyDetial(); // 创建中介者 $mediator = new Mediator($userPayer, $userPayee, $notify, $moneyDetial); // 为每个同时类设置中介者 $userPayer->setMediator($mediator); $userPayee->setMediator($mediator); $notify->setMediator($mediator); $moneyDetial->setMediator($mediator); // 打赏 $userPayer->changeMoney(10);
八.输出结果:
UID为1的用户金币- 10 UID为2的用户金币+ 10 用户1向用户2打赏10个金币