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

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

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

一、概述

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

相关文章

来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

3028
来自专栏魂祭心

原 canvas绘制clock

4244
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

7098
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2627
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3225
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2892
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

4838
来自专栏杨龙飞前端

scrollto 到指定位置

2544
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2130

扫码关注云+社区