Раскрытие информации: я хранитель event_aggregator
драгоценного камня
В зависимости от того, как вы хотите решить проблему, вы можете использовать агрегатор событий. Таким образом, вы можете публиковать сообщения определенного типа, а затем заставлять ваши объекты слушать типы, которые вы хотите, чтобы они получали. В некоторых случаях это может быть лучше, чем обычные события, потому что вы получаете очень слабую связь между вашими объектами. Производителю и слушателю события не нужно делиться ссылкой на другого.
Существует драгоценный камень, который помогает вам с этим, называется event_aggregator
. С его помощью вы можете сделать следующее:
#!/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
Имейте в виду, что по умолчанию он асинхронный, поэтому, если вы выполните только этот сценарий, сценарий может завершиться до того, как будут переданы события. Чтобы отключить асинхронное поведение, используйте:
EventAggregator::Message.new("MessageType1", ["Some Stuff",2,3], false).publish
#The third parameter indicates async
Надеюсь, это может быть полезно в вашем случае