据说是中介者模式--这样的相互反复调用算个求的好代码

<?php
/**
 * 中介者模式
 *
 * 用一个中介对象来封装一系列的对象交互
 * 使各对象不需要显式地相互引用从而使其耦合松散
 * 而且可以独立地改变它们之间的交互
 */

abstract class Mediator
{
    abstract public function send($message,$colleague);
}

abstract class Colleague
{
    private $_mediator = null;
    public function __construct($mediator)
    {
        $this->_mediator = $mediator;
    }
    public function send($message)
    {
        $this->_mediator->send($message,$this);
    }
    abstract public function notify($message);
}

//新建对象,并把它作为参数给Colleague1或者Colleague2
//所以Colleague1或者Colleague2就有了除本身外的,还有这里的方法
//还有继承于Mediator方法,还有它本身继承于Colleague的方法
class ConcreteMediator extends Mediator
{
    private $_colleague1 = null;
    private $_colleague2 = null;
    //
    public function send($message,$colleague)
    {
        if($colleague == $this->_colleague1)
        {
            $this->_colleague1->notify($message);
        }
        else
        {
            $this->_colleague2->notify($message);
        }
    }
    //给它的参数赋一个对象
    public function set($colleague1,$colleague2)
    {
        $this->_colleague1 = $colleague1;
        $this->_colleague2 = $colleague2;
    }
}

class Colleague1 extends Colleague
{
    public function notify($message)
    {
        echo "Colleague1 Message is :".$message."<br/>";
    }
}

class Colleague2 extends Colleague
{
    public function notify($message)
    {
        echo "Colleague2 Message is :".$message."<br/>";
    }
}

//
$objMediator = new ConcreteMediator();
$objC1 = new Colleague1($objMediator);
$objC2 = new Colleague2($objMediator);
$objMediator->set($objC1,$objC2);
$objC1->send("to c2 from c1");
$objC2->send("to c1 from c2");
原文地址:https://www.cnblogs.com/jiufen/p/5007523.html