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

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

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

一、概述

中介者模式(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 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

Actor模型是做什么的?

问题 用户A的操作 (1)开始事务 (2)操作资源1 (3)操作资源2 (4)提交事务 用户B的操作 (1)开始事务 (2)操作资源2 (3)操作资源1...

3124
来自专栏Play & Scala 技术分享

Scala之美 - Future & map & flatMap

3588
来自专栏章鱼的慢慢技术路

《算法图解》第五章笔记与课后练习

1974
来自专栏编程

每个Python新手都应该知道的一些编程技巧

每天你都应该努力提升自己的编码技能,今天我给Python新手带来了一些编程建议。 Python箴言 打开Python交互终端并运行下面命令 然后命令会有一些输出...

1989
来自专栏逢魔安全实验室

CVE-2018-2628 Weblogic反序列化POC重构详解

3595
来自专栏JAVA烂猪皮

BAT面试常的问题和最佳答案

客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将reques...

912
来自专栏Java帮帮-微信公众号-技术文章全总结

Java并发编程,一定要有自己的理解【面试+工作】

编写优质的并发代码是一件难度极高的事情。Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的...

1427
来自专栏章鱼的慢慢技术路

《算法图解》第五章笔记与课后练习_散列函数与散列表

1785
来自专栏丑胖侠

《Drools 7 规则引擎教程》番外篇-规则条件匹配机制

问题场景 QQ技术群(593177274)中有同学遇到这一个问题场景:在多条规则(比如3条)的when中使用了一个相同的静态方法,并在静态方法中打印相关的日志信...

2448
来自专栏程序员互动联盟

抓包工具Wireshark过滤规则实践第一篇

引子 现在从网上看到的一些wireshark过滤规则的介绍,都是比较老一点的,新版本的语法好像有所变化,所以在这里写一篇基于最新的1.12版本的wireshar...

4159

扫码关注云+社区