B8:中介者模式 Mediator

Posted 罗夏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B8:中介者模式 Mediator相关的知识,希望对你有一定的参考价值。

用一个中介对象来封装一系列的对象交互,中介者使得各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互.

减少了各对象之间的耦合,使得可以独立的改变或复用各个Mediator或Colleague
Mediator控制了交互,导致Mediator变的复杂

ps:

各个同事类需要知道中介者,但各个同事类并不知道彼此(各对象不需要显示的相互引用).

主要的交互逻辑由中介者完成

在同事类中添加接口来增加中介者,导致职责缺乏单一,除非是需要复杂的交互逻辑.

 

UML:

 

示例代码:

一个Colleague发消息,一个Colleague收消息,中介者处理交互.

// 抽象中介者
abstract class Mediator
{
    protected $sender;
    protected $receiver;

    public function setSender(Colleague $colleague)
    {
        $this->sender = $colleague;
    }

    public function setReceiver(Colleague $colleague)
    {
        $this->receiver = $colleague;
    }

    abstract public function sendMessage(Colleague $colleague, $message);
}

// 具体中介者
class ConcreateMediator extends Mediator
{
    public function sendMessage(Colleague $colleague, $message)
    {
        if ($colleague instanceof $this->sender) {
            $this->receiver->receiveMessage($message);
        }
    }
}

// 抽象同事
abstract class Colleague
{
    protected $mediator;

    public function __construct(Mediator $mediator)
    {
        $this->mediator = $mediator;
    }
}

// 同事1
class Colleague1 extends Colleague
{
    public function sendMessage($message)
    {
        $this->mediator->sendMessage($message, $this);
    }
}

// 同事2
class Colleague2 extends Colleague
{
    public function receiveMessage($message)
    {
        echo "同事2收到消息{$message}";
    }
}



$mediator = new ConcreateMediator();

$colleague1 = new Colleague1($mediator);
$colleague2 = new Colleague2($mediator);

$mediator->setSender($colleague1); // 命令一般由中介者发出
$mediator->setReceiver($colleague2);
$mediator->sendMessage($colleague1, \'你好\');

  

 

以上是关于B8:中介者模式 Mediator的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之中介者模式 Mediator

Mediator Pattern中介者模式

设计模式-中介者模式(Mediator)

JAVA SCRIPT设计模式--行为型--设计模式之Mediator中介者模式(17)

设计模式---接口隔离模式之中介者模式(Mediator)

中介者模式-Mediator