Disclosure: Ich bin der Maintainer des event_aggregator
gem
Je nachdem, wie Sie die nähern wollen Problem könnten Sie möglicherweise eine Ereignisaggregation verwenden Ator. Auf diese Weise können Sie Nachrichten eines bestimmten Typs veröffentlichen und dann Ihre Objekte auf die Typen warten lassen, die sie empfangen sollen. Dies kann in bestimmten Fällen besser als normale Ereignisse sein, weil Sie eine sehr lockere Verbindung zwischen Ihren Objekten erhalten. Der Ereignisproduzent und der Listener müssen keinen Verweis auf den anderen freigeben.
Es gibt ein Juwel, das Ihnen dabei hilft event_aggregator
genannt. Mit ihm können Sie wie folgt vorgehen:
#!/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
Beachten Sie, dass es async ist standardmäßig, wenn Sie also nur dieses Skript ausführen beenden das Skript könnte, bevor die Ereignisse übergeben werden. So deaktivieren Sie die Verwendung asynchroner Verhalten:
EventAggregator::Message.new("MessageType1", ["Some Stuff",2,3], false).publish
#The third parameter indicates async
Hoffentlich kann dies hilfreich sein, in Ihrem Fall
ich den Observer Design Muster verwenden möchten. – Ash