【问题标题】:Laravel 5 Event - Is this a mediator or observer?Laravel 5 事件 - 这是调解者还是观察者?
【发布时间】:2016-05-26 15:26:39
【问题描述】:

我今天正在和另一位开发人员讨论 Laravel 的事件系统。他提到 Laravel 的事件分发器使用了观察者模式。

我一直认为它实现了一种中介模式,因为您的对象总是通过事件调度程序对象监听/触发事件,但文档说它是一个观察者。

Event::listen('event.name', function ($foo, $bar) {
    //
});

Event::fire("event.name", []);

这不是中介模式吗?

【问题讨论】:

    标签: php design-patterns laravel-5 observers mediator


    【解决方案1】:

    我对 Laravel 的具体作用没有确切的了解,实际上如果文档说它是基于观察者模式构建的,我会相信。

    但是您的问题是关于代码的外观,根据我的经验,我可以很容易地通过类比识别出此处的观察者:

    • listen 类似于 Observer 的订阅/附加
    • fire 类似于 Observer 的通知/更新

    在这里我觉得中介者很奇怪,因为即使其目的是促进某些对象之间的通信,我也不能将其视为分发通知的好方法。出于这个原因,我肯定会押注观察者。

    【讨论】:

    • @floopy12 但是如果它是一个观察者,你不是得到一个对象的实例然后监听它吗?在这种情况下,您正在侦听一个 Event 类,而不是您感兴趣的对象。拥有 listen/fire 并不意味着它是一个观察者。中介也可以有监听/触发。
    • @Moon 在我看来,唯一重要的是你在听别的东西,即使它不是一个“对象”,这意味着你对某种方式感兴趣。观察者模式(或any) 不属于任何语言或范式,它是表达问题和解决方案的概念性思想。实施应根据您的特定需求进行调整。在这里,它似乎更像是一种“功能性”方法,您可以在其中侦听事件并将回调关联到它,而不是经典的 OOP 实现
    • @floopy12 // 我完全理解。问题在于,这种植入也意味着编译有些松散,因为事件名称可以是任何东西,而无论我是否在监听特定事件,Event 都充当中介。我想这就是为什么一些 PHP 框架称它为中介,而 Laravel 没有。
    • @Moon :关于松散耦合的事情,在 Mediator 和 Observer 中,objA 和 objB 不直接通信(分别通过 Mediator 或“事件”,即使它是从可观察对象触发的)。提供的代码不足以了解 Laravel 在后台实际做了什么。但是,鉴于调解员促进了其他两个(或更多)对象之间的通信,如果 Event 代表调解员,那么这里的“两个主体”在哪里?此外, Event 是否是 Mediator 的正确名称? (考虑到它是 Observable 的可接受名称)
    • @floopy12 // 不同意,但也不同意。据我了解 GOF 书,观察者确实相互依赖。您需要一个主题的实例来收听。我知道植入会改变,但我真的不认为意图应该改变。在这种特殊情况下,没有人实际上是相互依赖的。它只是在程序员的脑海中。我想我在这里问了一个错误的问题,因为不会有具体的答案,但会有好的意见。我很欣赏你的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    相关资源
    最近更新 更多