怎么用PHP实现房产中介

中介者模式

中介者模式是什么呢?其实很好理解,那就是中介,中介可能大家都并不陌生,房产中介的电话也接到不少;中介者模式就充当着房产中介的角色,就好比我们要租房子,我们只需要与中介建立联系,而房源以及业主不需要我们去建立联系。

中介者模式主要是为了解耦多对多的联系,没有中介者之前的模式类似于网状结构,要对每个对象都建立联系,如果需要改动则所有对象都可能需要进行改动,牵一发而动全身。

下面以商城中采购销售库存为例子,未使用中介者模式解耦的结构如下:

中介者模式-网状结构

使用中介者模式后,可以减少对象之间的耦合,都交给了中介者去联系,结构变成了这样:

中介者模式-星状结构

对比下两者 UML 类图:

  • 中介者模式类图:
    中介者模式类图

  • 非中介者模式类图:

    非中介者模式类图

两者比较得知,不使用中介者模式,对象耦合严重,需要每个建立联系。

中介者模式的定义

中介者模式:用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其松耦合,而且可以独立地改变他们之间的交互。

中介者模式有以下几部分组成:

  1. 抽象中介者

    抽象中介者是中介者的抽象类,提供了执行同事对象信息的抽象方法。

  2. 具体中介者

    实现了抽象中介者的方法,协调各个同事角色之间的交互关系。

  3. 抽象同事类

    抽象同事类,保存中介者对象,提供同事对象交互的抽象方法。

  4. 具体同事类

    抽象同事类的实现者。如需要与其他同事对象交互时,由中介者对象负责交互。

代码实现

上文提及采购销售库存例子中介者具体实现代码,详细代码请查看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 协议》,转载必须注明作者和本文链接
lemon_lyue
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!