Simple implementation of the Observer pattern in Crystal. It is loosely based on the Observable module from Ruby :)
The observer pattern is used to avoid tightly coupling objects that stand in a one-to-many relationship. It allows you to notify dependents about changes that happened to your object, without having hard-coded dependencies :)
Add to your shard.yml
dependencies:
observable:
github: tpei/observable
branch: masterand then install the library into your project with
$ crystal depsInclude observable in the class you want to observe:
require "observable/observable"
class ToObserve
include Observable
endThis provides you with the following methods:
add_observer(observer : Observer)changed(state=true)changed?count_observersdelete_observer(observer : Observer)delete_observersnotify_observers
and as an added bonus, because I dislike the forced changed call precondition:
notify_observers!, which notifies no matter if changed or not
Then you can include observer in the class you want observing:
require "observable/observer"
class Observing
include Observer
def update(observable : Observable)
# do whatever you want to do if your observable changes
end
endThis only gives you an update(observable : Observable) method you should override, because it willl raise an error otherwise.
Unfortunately we don't have ruby's verbosity and dynamism here so it's all a little more static. Especially the update method can really only pass on the observable object.