- 中介者模式是属于行为型模式
- 主要为了解决就是对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
一、使用场景
1、系统中对象间存在较为复杂引用,导致依赖关系和结构混乱而无法复用的情况。
2、想通过一个中间类来封装多个类的行为,但是又不想要太多的子类。
二、优点
1、减少耦合,将多个对象之间的联系紧耦合封装到中介对象中。
2、将多个对象之间的交互联系集中在中介对象中。发送变化仅需修改中介对象即可、提供系统的灵活性、使同事对象独立而易于复用。
3、符合迪米特原则。就是说一个对象应当对其他对象有尽可能少的了解。减少各个对象之间的了解。
三、缺点
每添加对象,就需要在中介处更新,如果对象过多,中介类就会变的臃肿,复杂难以维护中介出问题,整个程序玩完,道理和卖房中介卷钱跑路一样
举例:
<?php
abstract class Mediator
{
abstract public function Sale(HouseOwner $houseOwner);
abstract public function Register(HouseOwner $houseOwner);
}
class HouseMediator extends Mediator
{
public $houseOwners = [];
public function Register(HouseOwner $houseOwner)
{
if (!in_array($houseOwner, $this->houseOwners)) {
$this->houseOwners[$houseOwner->houseType] = $houseOwner;
}
}
public function Sale(HouseOwner $houseOwner)
{
echo $houseOwner->HouseMessage();
echo '不合适?还有其他房源';
foreach ($this->houseOwners as $house){
echo $house->HouseMessage()."</br>";
}
}
}
abstract class HouseOwner
{
public $mediator;
public $houseType;
public function __construct(Mediator $mediator)
{
$this->mediator = $mediator;
}
public abstract function HouseMessage();
public abstract function Sale();
}
class OneHouse extends HouseOwner
{
public $houseType=1;
public function HouseMessage()
{
echo '这是单间';
}
public function Sale()
{
$this->mediator->Sale($this);
}
}
class TwoHouse extends HouseOwner
{
public $houseType=2;
public function HouseMessage()
{
echo '这是两房';
}
public function Sale()
{
$this->mediator->Sale($this);
}
}
class ThreeHouse extends HouseOwner
{
public $houseType=3;
public function HouseMessage()
{
echo '这是三房';
}
public function Sale()
{
$this->mediator->Sale($this);
}
}
$m = new HouseMediator();
$u1 = new OneHouse($m);
$u2 = new TwoHouse($m);
$u3 = new ThreeHouse($m);
$m->Register($u1);
$m->Register($u3);
$m->Register($u2);
$u3->Sale();//通过中介介绍房间信息