<?php /* * 中介者模式:用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用从而使其耦合松散,而且可以独立地改变它们之间的交互 */ /* * 以一个同学qq群为例说明,qq作为中介者,同学作为相互交互的对象 */ //抽象中介者,利用中介发送消息 abstract class Mediator{ abstract function send($message,$user); } //抽象同事类,利用中介发送消息 abstract class Colleague{ private $mediator; public function __construct($mediator){ $this->mediator = $mediator; } public function send($message){ $this->mediator->send($message,$this); } abstract function notify($message); } //具体的同事类a b c d e class StuA extends Colleague{ public function notify($message){ echo 'Stu A says: '.$message; echo "<br/>"; } } class StuB extends Colleague{ public function notify($message){ echo 'Stu B says: '.$message; echo "<br/>"; } } class StuC extends Colleague{ public function notify($message){ echo 'Stu C says: '.$message; echo "<br/>"; } } class StuD extends Colleague{ public function notify($message){ echo 'Stu D says: '.$message; echo "<br/>"; } } class StuE extends Colleague{ public function notify($message){ echo 'Stu E says: '.$message; echo "<br/>"; } } //具体的中介者 class QQ extends Mediator{ public $users = array(); public function setUsers($user){//把对象添加进来 $this->users[] = $user; } public function send($message, $user){//推送消息 for($i=0;$i<count($this->users);$i++){ if($user == $this->users[$i]){ $this->users[$i]->notify($message); } } } } class Client{ public static function main(){ //流程:先建立中介者 $qq = new QQ(); //实例化交互对象 $stu_a = new StuA($qq); $stu_b = new StuB($qq); $stu_c = new StuC($qq); $stu_d = new StuD($qq); $stu_e = new StuE($qq); //把对象加入中介者 $qq->setUsers($stu_b); $qq->setUsers($stu_a); $qq->setUsers($stu_c); $qq->setUsers($stu_d); $qq->setUsers($stu_e); //交流 $stu_a->send('昨天点名了吗,各位大神'); $stu_c->send('难道你没去'); $stu_a->send('是啊'); $stu_b->send('恭喜你中奖了'); $stu_d->send('恭喜你中奖了'); $stu_e->send('恭喜你中奖了'); $stu_a->send('我去'); } } Client::main(); ?>
UML类图如下