如何在Smalltalk中创建自己的事件?我基本上是在寻找某些特定事件发生时可以触发的软件事件。
在经典的Smalltalk中(由Squeak支持,是原始XEROX Parc图像的直接派生),您具有基本的发布/订阅模型。在协议浏览器中查找对象实例的“事件”。
在现代Smalltalk中,您可以使用Exception类及其子类来使用catch / throw用户定义的事件。有关详细信息,请参见类文档中的Exception。
您还可以选择Squeaksource中提供的Announcements框架,作为经典事件框架的更灵活的版本。
概括地说,事件是基于Observer Pattern的,其中主题具有依赖项并观察到选定的事件。
这将在它们之间创建一个loose coupling的关系。
在Squeak或Pharo中,通过某种既了解对象又了解对象的方法,您会像这样:
观察
elevatorPanel when: #openDoorClicked send: #onOpenDoorClicked to: elevator
事件触发
另一方面,以自我为电梯面板:
self triggerEvent: #openDoorClicked
然后您将让elevator
收到onOpenDoorClicked
消息。
类似地,您可以使用参数来做到这一点:
elevatorPanel when: #floorSelected: send: #onFloorSelected: to: elevator with: floorNumber
在这种情况下,您可以通过两种方式触发,第一种
self triggerEvent: #floorSelected:
将使elevator
观察者实例接收以onFloorSelected:
作为参数的floorNumber
消息。
第二,在触发时覆盖该值
self triggerEvent: #floorSelected: with: aFresherFloorValue
在这种情况下,您还将让elevator
接收onFloorSelected:
,但要带有aFresherFloorValue
,而不是在观察设置过程中捕获的floorValue
。