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

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

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

一、概述

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

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

1、优点

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

2、缺点

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

二、类图

三、具体实现

1、业务分析

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

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

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

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

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

2、编程实现

1)抽象中介者

abstract class Mediator{
         public functionexecute($msg, Colleague $colleague){}
         public functionsetColleague(array $arrColleague){}
}

2)抽象实现类

abstract class Colleague{
         protected $mediator;
         public function__construct(Mediator $mediator){
                   $this->mediator= $mediator;
         }
         public functionsend($msg);
}

3)具体中介者

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)具体实现类,共两个

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)客户端

$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

相关阅读:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吴伟祥

遵循面向对象设计原则,设计出高内聚低耦合可扩展模块

所谓易,“变易”,“简易”,“不易”,就是要告诉我们如何从变化中 抽出 不变的 —— 选择一个正确的抽象视角。七大基本原则介绍完毕,很空洞,需要联系代码仔细体会...

693
来自专栏纯洁的微笑

设计模式是什么鬼?

651
来自专栏c#开发者

深入abstract class和interface

abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。...

3399
来自专栏苦逼的码农

五分钟了解设计模式(3)---适配器模式

在我们的日常生活中,对于适配器,可以说是无处不在。例如我们平时使用的笔记本电脑,可能笔记本电脑的工作电压是20V,但我们一般的家庭用电是220V,这时候电脑在充...

783
来自专栏JAVA技术zhai

从1.6W名面试者中收集的Java面试题精选汇总(内附知识脑图)

2778
来自专栏技术博客

设计模式原则(单一、开放封闭、里氏代换、依赖倒转、迪米特法则五大原则)

        如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,当变化发生时,设计会遭受到意想不...

762
来自专栏令仔很忙

Spring从入门到精通(一)----IoC(控制反转)

在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过相互合作,最终实现系统的业务逻辑。

762
来自专栏令仔很忙

面向对象

在面向对象编程出现之前,几乎所有的程序都是以面向过程为中心的,程序的运行从某个地方开始运行达到一定的目的就结束了。而且程序的代码修改和重复使用率比较低。面向...

842
来自专栏SAP最佳业务实践

从SAP最佳业务实践看企业管理(93)-PP-联产品与副产品

一、联产品与副产品的定义与区分: 联产品是指用同一种原料,经过同一个生产过程,生产出两种或两种以上的不同性质和用途的产品;副产品是指在生产主要产品过程中附带生产...

3034
来自专栏java学习

Java每日一题_关于SpringAOP

AOP的概念是Aspected Oriented Programming 面向方切编程。

723

扫码关注云+社区