有人能用简单的术语解释"信号和插槽"模式吗?
信号和时隙是解耦发送者(信号)和零个或多个接收者(时隙)的一种方式.假设您有一个系统,其中包含您希望对系统中对这些事件感兴趣的任何其他部分可用的事件.您可以使用信号和插槽模式,而不是将生成事件的代码硬连接到想要了解这些事件的代码.
当发送方发信号通知事件时(通常通过调用与该事件/信号相关联的功能),将自动调用该事件的所有接收方.这允许您在程序的生命周期内根据需要连接和断开接收器.
由于这个问题被标记为C++,因此这里有一个Boost.Signals库的链接,它有一个更全面的解释.
我认为,当您将它们视为观察者模式或发布/订阅者模式的可能实现工具时,可以最好地描述信号和插槽.signal
例如buttonPressed(IdType)
,在发布者端有一个.只要按下按钮,就会调用连接到该信号的所有插槽.插槽位于订户端.例如,插槽可以是sendMail(IdType)
.
随着事件"按下按钮",插槽将知道按下了哪个按钮,因为id已被移交.IdType
表示通过发布服务器和订阅服务器之间的连接发送的数据类型.用于用户可能的操作将是connect(signal, slot)
其中可以连接buttonPressed(IdType)
与sendMail(IdType)
,使得如果按下按钮,则该特定槽被调用.
这样做的好处是用户(插槽侧)不需要关心信号的细节.它只需要连接.因此,这里我们有很多松耦合.您可以更改按钮实现,但插槽的接口仍然是相同的.
查看Qt信号/插槽或提升信号以获取更多信息.
想象一下,在您的应用程序中使用GUI.大多数情况下,控制流程不会是非常线性的,即您没有明确的动作序列,而是让用户与GUI交互(如按钮,菜单等).
这本质上是一个事件驱动模型,可以很好地实现信号和插槽模式.信号是由对象生成的事件(想想GUI组件),而槽是这些事件的接收者.
下面是一个示例:假设您有一个复选框,表示为编程语言中的对象.该复选框可能会出现多种情况:它可以切换,这反过来也意味着它可以设置也可以不设置.那些是它可以发出的信号.我们将它们命名为checkboxToggled,checkboxSet和checkboxUnset.如您所见,在此示例中,复选框将始终在切换时发出checkboxToggled信号,但也恰好是其他两个信号之一,具体取决于状态更改的方式.
现在假设有一些其他对象,即标签,为了这个例子,它总是作为一个对象存在,但可以"出现"和"消失",系统发出蜂鸣声(也由一个对象表示),它可以简单地发出哔哔声.那些是对象所拥有的插槽.我们称之为"messageAppear","messageDisappear"和"beep".
假设每次切换复选框时都希望系统发出蜂鸣声,并且标签会根据用户是选中还是清除复选框而显示或消失.
因此,您可以将以下信号连接到以下插槽(左侧信号,右侧插槽):
checkboxToggled -> beep checkboxSet -> messageAppear checkboxUnset -> messageDisappear
基本上就是这样.
信号和槽也可能有参数.例如,使用设置数值的滑块,您希望在用户移动滑块后立即发送更改的值以及发出的信号:sliderChanged(int).
当然,要实际做一些有用的事情,你会写一些自己的类,其中包含一些自己的信号和插槽.这很容易完成并使用这些自己的信号和插槽,您可以通过事件驱动的方式与GUI或代码的其他部分进行交互.
请记住,信号和插槽通常是对称的,因为通常可能存在与插槽相对应的信号.例如,复选框可能会在切换时发出信号,但它也可能包含一个切换复选框本身的插槽.可以很容易地实现单独的复选框,这些复选框总是彼此相反地设置.