⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 10 - coupling systems loosely with callbacks.rb

📁 O Reilly Ruby Cookbook source code
💻 RB
字号:
module EventDispatcher  def setup_listeners    @EventDispatcher_listeners = {}  end  def subscribe(event, &callback)    (@EventDispatcher_listeners[event] ||= []) << callback  end  protected  def notify(event, *args)    if @EventDispatcher_listeners[event]      @EventDispatcher_listeners[event].each do |m|         m.call(*args) if m.respond_to? :call      end    end    return nil  endend#---class Factory  include EventDispatcher  def initialize    setup_listeners  end  def produce_widget(color)    #Widget creation code goes here...    notify(:new_widget, color)  endend#---class WidgetCounter  def initialize(factory)    @counts = Hash.new(0)    factory.subscribe(:new_widget) do |color|      @counts[color] += 1      puts "#{@counts[color]} #{color} widget(s) created since I started watching."    end  endend#---f1 = Factory.newWidgetCounter.new(f1)f1.produce_widget("red")# 1 red widget(s) created since I started watching.f1.produce_widget("green")# 1 green widget(s) created since I started watching.f1.produce_widget("red")# 2 red widget(s) created since I started watching.# This won't produce any output, since our listener is listening to# another Factory.Factory.new.produce_widget("blue")#---module EventDispatcher  def notify(event, *args)   if @EventDispatcher_listeners[event]      @EventDispatcher_listeners[event].each do |m|         yield(m.call(*args)) if m.respond_to? :call      end    end    return nil  endend#---class Portal  include EventDispatcher  def initialize    setup_listeners  end  def render    puts '<table>'    render_block = Proc.new { |box| puts "  <td>#{box}</td>" }    [:row1, :row2].each do |row|       puts ' <tr>'      notify(row, &render_block)      puts ' </tr>'    end    puts '</table>'  endend#---portal = Portal.newportal.subscribe(:row1) { 'Stock Ticker' }portal.subscribe(:row1) { 'Weather' }portal.subscribe(:row2) { 'Pointless, Trivial News' }portal.render# <table>#  <tr>#   <td>Stock Ticker</td>#   <td>Weather</td>#  </tr>#  <tr>#   <td>Pointless, Trivial News</td>#  </tr># </table>#---

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -