Skip to content

Instantly share code, notes, and snippets.

@hrs
Created March 31, 2015 21:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hrs/a89964cdd294b4458e51 to your computer and use it in GitHub Desktop.
Save hrs/a89964cdd294b4458e51 to your computer and use it in GitHub Desktop.
Design Pattern Frolics!
class MessageDispatcher
def initialize
@observers = []
end
def register(observer)
@observers << observer
end
def dispatch(message)
@observers.each do |observer|
observer.notify(message)
end
end
end
class ObserverFactoryFactory
def build(&block)
Class.new do
define_method :notify do |message|
block.call(message)
end
end
end
end
class OutputBuffer
def initialize(stream)
@messages = []
@stream = stream
end
def <<(message)
@messages << message
end
def flush
@messages.each do |message|
@stream.print(message)
end
@messages = []
end
end
buffer = OutputBuffer.new(File.new("output", "w"))
fizz_observer_factory = ObserverFactoryFactory.new.build do |message|
if message % 3 == 0
buffer << "fizz"
end
end
buzz_observer_factory = ObserverFactoryFactory.new.build do |message|
if message % 5 == 0
buffer << "buzz"
end
end
number_observer_factory = ObserverFactoryFactory.new.build do |message|
if message % 3 != 0 && message % 5 != 0
buffer << message
end
end
null_observer_factory = ObserverFactoryFactory.new.build do |message|
buffer << "\n"
end
dispatcher = MessageDispatcher.new
dispatcher.register(fizz_observer_factory.new)
dispatcher.register(buzz_observer_factory.new)
dispatcher.register(number_observer_factory.new)
dispatcher.register(null_observer_factory.new)
1.upto(100).each do |i|
dispatcher.dispatch(i)
end
buffer.flush
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment