怎么用PHP实现房产中介
中介者模式
中介者模式是什么呢?其实很好理解,那就是中介
,中介可能大家都并不陌生,房产中介的电话也接到不少;中介者模式就充当着房产中介的角色,就好比我们要租房子,我们只需要与中介建立联系,而房源以及业主不需要我们去建立联系。
中介者模式主要是为了解耦多对多的联系,没有中介者之前的模式类似于网状结构,要对每个对象都建立联系,如果需要改动则所有对象都可能需要进行改动,牵一发而动全身。
下面以商城中采购
、销售
、库存
为例子,未使用中介者模式解耦的结构如下:
使用中介者模式后,可以减少对象之间的耦合,都交给了中介者去联系,结构变成了这样:
对比下两者 UML 类图:
中介者模式类图:
非中介者模式类图:
两者比较得知,不使用中介者模式,对象耦合严重,需要每个建立联系。
中介者模式的定义
中介者模式:用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其松耦合,而且可以独立地改变他们之间的交互。
中介者模式有以下几部分组成:
抽象中介者
抽象中介者是中介者的抽象类,提供了执行同事对象信息的抽象方法。
具体中介者
实现了抽象中介者的方法,协调各个同事角色之间的交互关系。
抽象同事类
抽象同事类,保存中介者对象,提供同事对象交互的抽象方法。
具体同事类
抽象同事类的实现者。如需要与其他同事对象交互时,由中介者对象负责交互。
代码实现
上文提及
采购
、销售
、库存
例子中介者具体实现代码,详细代码请查看GitHub
不使用中介者模式具体实现代码,详细代码请查看GitHub
下面代码实现为通用代码:
抽象中介者:
/**
* 抽象中介
*
* Interface AbstractMediator
* @package DesignPatterns\AbstractMediator
*/
abstract class AbstractMediator
{
/**
* 事件方法, 处理多个对象之间的关系
*
* @param string $classAlias 类别名
* @param string $method 方法名
* @param array $args 参数
* @return mixed
*/
abstract public function execute(string $classAlias, string $method, ...$args);
/**
* 设置同事类
*
* @param AbstractColleague $colleague 同事类
* @param string $classAlias 别名
*/
abstract public function setColleague(AbstractColleague $colleague, string $classAlias);
}
具体中介者:
/**
* 具体中介类
*
* Class ConcreteAbstractMediator
* @package DesignPatterns\Mediator
*/
class ConcreteMediator extends AbstractMediator
{
/**
* 事件方法, 处理多个对象之间的关系
*
* @param string $classAlias
* @param string $method 方法名
* @param array $args
* @return mixed|void
*/
public function execute(string $classAlias, string $method, ...$args)
{
return $this->{$classAlias}->{$method}(...$args);
}
}
抽象同事类:
/**
* 抽象同事
*
* Class AbstractColleague
* @package DesignPatterns\AbstractMediator
*/
abstract class AbstractColleague
{
/**
* @var AbstractMediator $mediator
*/
protected $mediator;
/**
* 设置中介者
*
* @param AbstractMediator $mediator 中介者
*/
public function setMediator(AbstractMediator $mediator)
{
$this->mediator = $mediator;
}
}
具体同事类:
/**
* 具体同事类
*
* Class ConcreteColleague
* @package DesignPatterns\Mediator
*/
class ConcreteColleague extends AbstractColleague
{
/**
* do something
*/
public function doSomething()
{
// TODO
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: