- Notifications
You must be signed in to change notification settings - Fork8
The Observer pattern provides a simple mechanism for one object to inform a set of interested third-party objects when its state changes.
License
ruby/observer
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
The Observer pattern (also known as publish/subscribe) provides a simplemechanism for one object to inform a set of interested third-party objectswhen its state changes.
The notifying class mixes in the +Observable+module, which provides the methods for managing the associated observerobjects.
The observable object must:
- assert that it has +#changed+
- call +#notify_observers+
An observer subscribes to updates using Observable#add_observer, which alsospecifies the method called via #notify_observers. The default method fornotify_observers is #update.
Add this line to your application's Gemfile:
gem'observer'
And then execute:
$ bundleOr install it yourself as:
$ gem install observerThe following example demonstrates this nicely. A +Ticker+, when run,continually receives the stock +Price+ for its@symbol. A +Warner+is a general observer of the price, and two warners are demonstrated, a+WarnLow+ and a +WarnHigh+, which print a warning if the price is below orabove their set limits, respectively.
The +update+ callback allows the warners to run without being explicitlycalled. The system is set up with the +Ticker+ and several observers, and theobservers do their duty without the top-level code having to interfere.
Note that the contract between publisher and subscriber (observable andobserver) is not declared or enforced. The +Ticker+ publishes a time and aprice, and the warners receive that. But if you don't ensure that yourcontracts are correct, nothing else can warn you.
require"observer"classTicker### Periodically fetch a stock price.includeObservabledefinitialize(symbol)@symbol=symbolenddefrunlast_price=nilloopdoprice=Price.fetch(@symbol)print"Current price:#{price}\n"ifprice !=last_pricechanged# notify observerslast_price=pricenotify_observers(Time.now,price)endsleep1endendendclassPrice### A mock class to fetch a stock price (60 - 140).defself.fetch(symbol)60 +rand(80)endendclassWarner### An abstract observer of Ticker objects.definitialize(ticker,limit)@limit=limitticker.add_observer(self)endendclassWarnLow <Warnerdefupdate(time,price)# callback for observerifprice <@limitprint"---#{time.to_s}: Price below #@limit:#{price}\n"endendendclassWarnHigh <Warnerdefupdate(time,price)# callback for observerifprice >@limitprint"+++#{time.to_s}: Price above #@limit:#{price}\n"endendendticker=Ticker.new("MSFT")WarnLow.new(ticker,80)WarnHigh.new(ticker,120)ticker.run
Produces:
Current price: 83Current price: 75--- Sun Jun 09 00:10:25 CDT 2002: Price below 80: 75Current price: 90Current price: 134+++ Sun Jun 09 00:10:25 CDT 2002: Price above 120: 134Current price: 134Current price: 112Current price: 79--- Sun Jun 09 00:10:25 CDT 2002: Price below 80: 79After checking out the repo, runbin/setup to install dependencies. Then, runrake test to run the tests. You can also runbin/console for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, runbundle exec rake install. To release a new version, update the version number inversion.rb, and then runbundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the.gem file torubygems.org.
Bug reports and pull requests are welcome on GitHub athttps://github.com/ruby/observer.
About
The Observer pattern provides a simple mechanism for one object to inform a set of interested third-party objects when its state changes.
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors10
Uh oh!
There was an error while loading.Please reload this page.