在busted源码core.lua中有这句
local mediator = require 'mediator'()
mediator.lua其实是busted调用了开源的代码mediator_lua,这个开源代码其实就是实现了一个中介者模式的事件处理机制。中介者模式使用一个中介对象来封装一系列对象之间的交互关系。中介者可以使各个对象之间不需要显示地复杂的调用,从而使耦合性降低,同时可以独立地改变对象之间的交互行为。个人认为中介者模式类似于消息传输中的订阅发布模式,消息的发布者不会将message发送给特定的接收者,而是发送给一个中介者,发送者不需要了解接收者的行为。同理订阅者可以接收自己感兴趣的消息,不需要了解发布者。
mediator.lua实现参照了发布订阅模式中的基于主题和基于内容的方式;这两种方式对应于代码中即channel和predicate概念,前者即将消息分为不同的主题(通道),后者基于内容,即只有当消息的属性或者内容匹配订阅者定义的约束条件时,才会触发消息的处理,也可以将两种方式混合。
channel = Channel('root'), -----基于主题channel
if not callback.options.predicate or callback.options.predicate(...) then ---基于内容是否满足约束条件
-- just take the first result and insert it into the result table
local value, continue = callback.fn(...)
if value then table.insert(result, value) end
if not continue then return result end
end
在busted源码中,如下:
busted.subscribe({ 'suite', 'reset' }, handler.baseSuiteReset, { priority = 1 }