如何在Smalltalk中创建自己的事件?我基本上是寻找一些软件事件,可以触发当一些特定的事件发生。
在经典的Smalltalk(由Squeak作为原始XEROX Parc图像的直接衍生物支持)中,您有一个基本的发布/订阅模型。在协议浏览器中查找Object实例的"event"
在现代Smalltalk中,您可以使用Exception类及其子类来使用catch/throw用户定义事件。有关详细信息,请参阅Exception类文档。
您还可以选择在Squeaksource中提供的公告框架,作为经典事件框架的更灵活的版本。
回顾一下,事件是基于观察者模式的,其中主题有依赖观察其上选定的事件。
这在它们之间创建了松耦合关系。
在Squeak或Pharo中,在一些同时知道受试者和观察者的方法中,你会这样做:
观察elevatorPanel when: #openDoorClicked send: #onOpenDoorClicked to: elevator
事件触发另一方面,当self
为elevatorPanel
时:
self triggerEvent: #openDoorClicked
您将有elevator
接收onOpenDoorClicked
的消息。
类似地,您可以使用参数:
elevatorPanel when: #floorSelected: send: #onFloorSelected: to: elevator with: floorNumber
在这种情况下,您可以通过两种方式触发,首先
self triggerEvent: #floorSelected:
这将使elevator
观察者实例接收以floorNumber
为参数的onFloorSelected:
消息。
第二,在触发时间重写该值
self triggerEvent: #floorSelected: with: aFresherFloorValue
在这种情况下,您还将有elevator
接收onFloorSelected:
,但aFresherFloorValue
而不是floorValue
在观察设置期间捕获。