设计模式专题(二十一) ——中介者模式

2018-03-07 11:53:51 浏览数 (1)

设计模式专题(二十一)——中介者模式

(原创内容,转载请注明来源,谢谢)

一、概述

中介者模式(Mediator)是用一个中介对象,来封装一系列对象的交互。中介者使各对象不需要显式地相互引用,从而松耦合,可以独立改变它们之间的交互。

中介者模式使得多个类之间互相通信,可以通过中介者快速实现。但是,也需要注意的是,如果系统频繁出现多对多通信的情况,首先需要排查类的设计,有可能是设计问题导致的。

1、优点

中介者模式减少各个类之间的耦合,使得可以读了改变和复用各个类。另外,由于把对象之间的协作进行抽象,将中介作为独立的概念封装到对象中,这样可以更宏观的角度关注对象之间的交互。

2、缺点

由于中介者过于集中化,交互的复杂性都由中介者进行承担,这样中介者会非常复杂。

二、类图

三、具体实现

1、业务分析

中介者模式中,共有四种角色:

1)抽象中介者,其负责对中介者进行抽象,定义一些应该实现的功能。

2)具体中介者,其负责实现具体中介的功能,其需要了解各类,并根据各个类发送过来的信息,实现信息交互。当只有一个中介者的情况下,具体中介者和抽象中介者类可以合并。

3)抽象实现类,定义实现类必须实现的功能,以便中介者统一调用。

4)具体实现类,定义具体实现的功能。

2、编程实现

1)抽象中介者

代码语言:javascript复制
abstract class Mediator{
         public functionexecute($msg, Colleague $colleague){}
         public functionsetColleague(array $arrColleague){}
}

2)抽象实现类

代码语言:javascript复制
abstract class Colleague{
         protected $mediator;
         public function__construct(Mediator $mediator){
                   $this->mediator= $mediator;
         }
         public functionsend($msg);
}

3)具体中介者

代码语言:javascript复制
class MediatorConcreteA extends Mediator{
         private $arrColleague;
         public functionsetColleague(array $arrColleague){
                   if(is_array($arrColleague)&& !empty($arrColleague)){
                            foreach($arrColleagueas $colleague){
                                     if(
                                               $colleagueinstanceof Colleague &&
                                               !isset($this->arrColleague[get_class($colleague)])
                                     ){
                                               $this->arrColleague[get_class($colleague)]= $colleague;
                                     }
                            }
                   }
                   return$this;
         }
         //colleagues表示发送消息方
         public functionexecute($msg, Colleague $colleague){
                   if(empty($msg)){
                            returnfalse;
                   }
                   if($colleagueinstanceof ColleagueA){
                            return$this->arrColleague['ColleagueB']->send($msg);
                   }elseif($colleague instanceof ColleagueB){
                            return$this->arrColleague['ColleagueA']->send($msg);
                   }else{
                            returnfalse;
                   }
         }
}

4)具体实现类,共两个

代码语言:javascript复制
class ColleagueA extends Colleague{
         protected $mediator;
         public function__construct(Mediator $mediator){
                   parent::__construct($mediator);
         }                
         public functionsend($msg){
                   echo'ColleagueA sends ' . $msg;
         }
}
class ColleagueB extends Colleague{
         protected $mediator;
         public function__construct(Mediator $mediator){
                   parent::__construct($mediator);
         }                
         public functionsend($msg){
                   echo'ColleagueB sends ' . $msg;
         }       
}

5)客户端

代码语言:javascript复制
$mediator = new MediatorConcreteA();
$colleagueA = new ColleagueA($mediator);
$colleagueB = new ColleagueB($mediator);
$mediator->setColleague(array($colleagueA, $colleagueB))
                    ->execute('send msg to B', $colleagueA);

四、总结

中介者模式实现类之间的解耦交互,类的通信全部通过中介者来实现,有点类似发布订阅模式,将信息发送给中介者后,由中介者去决定如何将消息转发。

——written by linhxx 2017.08.29

相关阅读:

设计模式专题(二十) ——职责链模式

设计模式专题(十九) ——命令模式

设计模式专题(十八) ——桥接模式

设计模式专题(十七) ——单例模式

设计模式专题(十六)——迭代器模式

设计模式专题(十五) ——组合模式

设计模式专题(十四)——适配器模式

设计模式专题(十三) ——备忘录模式

设计模式专题(十二)——状态模式

设计模式专题(十一)——抽象工厂模式

设计模式专题(十)——观察者模式

设计模式专题(九) ——外观模式

设计模式专题(八) ——模板方法模式

设计模式专题(七)——建造者模式

设计模式专题(六)——原型模式

设计模式专题(五)——工厂方法模式

设计模式专题(四)——代理模式

设计模式专题(三)——装饰模式

设计模式专题(二)——策略模式

设计模式专题(一)——面向对象的设计原则

0 人点赞