概述
中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
我们还是以摩托公司为例,因业务发展需要,现常年需要招聘一线生产工人,由于人力资源工作涉及面过于宽泛,故对于一线生产工人的工作招聘以及其他相关事宜我们都交由第三方人力资源服务公司(劳务外包)进行全权处理。在此场景中我们在上海三个分公司委托一个在上海的劳务公司进行招聘工作。由于工作疏忽其中一家公司为完成与劳务公司的协议签订。本文代码将对此场景进行实现。
模式结构
- Company - 公司基类
- CompanyShanghaiA - 上海浦东新区分公司
- CompanyShanghaiB - 上海宝山分公司
- CompanyShanghaiC - 上海嘉定分公司
- Mediator - 抽象中介类
- MediatorSh - 具体上海嘉定劳务中介类
UML图例
运行结果
代码实例
<?php
namespace Mediator;
//公司
abstract class Company
{
protected $_mediator; //委托中介
private $_demand; //需求
public $companyNumber;
public function __construct(Mediator $mediator, $demand)
{
$this->_mediator = $mediator;
$this->_demand = $demand;
}
//获取需求
function getDemand()
{
return $this->_demand;
}
//寻找工人
abstract function findWorker();
}
//上海分公司
class CompanyShanghaiA extends Company
{
function __construct(Mediator $mediator,$message)
{
$this->companyNumber = "sh001";
parent::__construct($mediator,$message);
}
//找工人-交给中介
function findWorker()
{
$this->_mediator->findWorker($this);
}
}
//上海分公司B
class CompanyShanghaiB extends Company
{
function __construct(Mediator $mediator,$message)
{
$this->companyNumber = "sh002";
parent::__construct($mediator,$message);
}
//找工人-交给中介
function findWorker()
{
$this->_mediator->findWorker($this);
}
}
//上海分公司B
class CompanyShanghaiC extends Company
{
function __construct(Mediator $mediator,$message)
{
$this->companyNumber = "sh003";
parent::__construct($mediator,$message);
}
//找工人-交给中介
function findWorker()
{
$this->_mediator->findWorker($this);
}
}
//抽象中介类
interface Mediator{
public function findWorker(Company $company);
}
//具体中介类,为家教匹配合适的学生
class MediatorSh implements Mediator{
//达成协议的公司编号-为在此列的不提供相关服务
private $companyList = array("sh001","sh002");
//人力资源开始按需求招工
public function findWorker(Company $tutor){
if(!in_array($tutor->companyNumber,$this->companyList)){
echo "公司({$tutor->companyNumber})未与人力资源公司达成协议 <br />";
}
foreach($this->companyList as $key=>$value){
if($tutor->companyNumber == $value){
echo "人力资源公司接到编号为".$tutor->companyNumber." 公司的招聘需求".$tutor->getDemand()." 并开始安排招聘工作"."<br />";
}
}
}
}
$mediatorSh = new MediatorSh();
$demand = "急需200名生产线工人,望加急处理。具体要求见附件Pdf";
$companyShanghaiA = new CompanyShanghaiA($mediatorSh,$demand);
$companyShanghaiA->findWorker();
$demand = "急需10名仓库工作人员,望加急处理。具体要求见附件Pdf";
$companyShanghaiB = new CompanyShanghaiB($mediatorSh,$demand);
$companyShanghaiB->findWorker();
$demand = "急需5名搬运工,望加急处理。具体要求见附件Pdf";
$companyShanghaiB = new CompanyShanghaiC($mediatorSh,$demand);
$companyShanghaiB->findWorker();
模式分析
中介者模式可以使对象之间的关系数量急剧减少。
中介者承担两方面的职责:
- 中转作用(结构性):通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,通过中介者即可。该中转作用属于中介者在结构上的支持。
- 协调作用(行为性):中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。该协调作用属于中介者在行为上的支持。
优缺点
中介者模式的优点
- 简化了对象之间的交互。
- 将各同事解耦。
- 减少子类生成。
- 可以简化各同事类的设计和实现。
中介者模式的缺点
- 在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
适用环境
在以下情况下可以使用中介者模式:
- 系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
- 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
- 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象。
- 交互的公共行为,如果需要改变行为则可以增加新的中介者类。
MVC架构中控制器
Controller 作为一种中介者,它负责控制视图对象View和模型对象Model之间的交互。如在Struts中,Action就可以作为JSP页面与业务对象之间的中介者。
关注微信公众号(yuantanphp) | |
---|---|
回复关键字 设计模式 可获取以下材料 《设计模式:可复用面向对象软件的基础》pdf版. php设计模式23种实例实现php源码 | ![]() |