Tiết lộ: Tôi là nhà duy trì của event_aggregator
đá quý
Tùy thuộc vào cách bạn muốn tiếp cận vấn đề bạn có khả năng có thể sử dụng một tập hợp sự kiện ator. Bằng cách này bạn có thể xuất bản các tin nhắn của một loại nhất định và sau đó để đối tượng của bạn lắng nghe các loại bạn muốn chúng nhận được. Điều này có thể trong một số trường hợp nhất định sẽ tốt hơn so với các sự kiện bình thường bởi vì bạn nhận được một khớp nối rất lỏng giữa các đối tượng của bạn. Nhà sản xuất và người nghe sự kiện không cần chia sẻ một tham chiếu đến người khác.
Có một viên ngọc giúp bạn với điều này được gọi là event_aggregator
. Với nó, bạn có thể làm như sau:
#!/usr/bin/ruby
require "rubygems"
require "event_aggregator"
class Foo
include EventAggregator::Listener
def initialize()
message_type_register("MessageType1", lambda{|data| puts data })
message_type_register("MessageType2", method(:handle_message))
end
def handle_message(data)
puts data
end
def foo_unregister(*args)
message_type_unregister(*args)
end
end
class Bar
def cause_event
EventAggregator::Message.new("MessageType1", ["Some Stuff",2,3]).publish
end
def cause_another_event
EventAggregator::Message.new("MessageType2", ["Some More Stuff",2,3]).publish
end
end
f = Foo.new
b = Bar.new
b.cause_event
b.cause_another_event
# => Some Stuff
2
3
# => Some More Stuff
2
3
Hãy nhận biết rằng nó là async theo mặc định, vì vậy nếu bạn thực hiện chỉ kịch bản này kịch bản có thể thoát ra trước khi các sự kiện được thông qua. Để vô hiệu hóa async sử dụng hành vi:
EventAggregator::Message.new("MessageType1", ["Some Stuff",2,3], false).publish
#The third parameter indicates async
Hy vọng rằng điều này có thể hữu ích trong trường hợp của bạn
Tôi muốn sử dụng các mẫu Observer Thiết kế. – Ash