有人能简单解释一下 "信号和槽" 模式吗?
有人能简单解释一下 "信号和槽" 模式吗?
信号和槽是一种解耦发送者(信号)和零个或多个接收者(槽)的方式。假设你有一个系统,其中存在你希望其他任何对这些事件感兴趣的系统部分可用的事件。与其将生成事件的代码硬编码到想要了解这些事件的代码中,你可以使用信号和槽模式。
当发送者发出一个事件(通常通过调用与该事件/信号关联的函数),所有该事件的接收者都会自动被调用。这使你可以在程序的生命周期内根据需要连接和断开接收者。
由于此问题标记为C ++,因此这里提供一个链接到Boost.Signals库的页面,该页面有更详细的说明。
signal
,例如buttonPressed(IdType)
。每当按下按钮时,将调用连接到该信号的所有槽。槽位于订阅方面。例如,槽可以是sendMail(IdType)
。IdType
表示在发布者和订阅者之间发送的数据类型。订阅者可能执行的操作是connect(signal, slot)
,它可以连接buttonPressed(IdType)
与sendMail(IdType)
,以便如果按下按钮,则调用特定的插槽。checkboxToggled -> beep
checkboxSet -> messageAppear
checkboxUnset -> messageDisappear
这基本上就是它的全部。
信号和槽还可以带参数。例如,使用一个滑块来设置一个数值,您想在用户移动滑块时将改变后的数值与发出的信号一起发送: sliderChanged(int)。
当然,要实际做些有用的事情,您需要编写一些自己的类,其中包含自己的信号和槽。这很容易做到,并且使用这些自己的信号和槽,您可以以事件驱动的方式与GUI或代码的其他部分进行交互。
请记住,信号和槽通常是对称的,因为通常会有一个与槽相对应的信号。例如,复选框可能在切换时发出信号,但它也可能包含一个切换复选框本身的槽。很容易实现两个相互对立的单选框。
槽
)的较大对象之间的中介,允许其他对象调用(信号
)这些子例程(槽
)并传递适当的参数,而无需了解这些其他对象除了需要哪些参数之外的任何信息。