观察

观察者模式是一种软件设计模式,其中一个对象(称为 subject)维护其依赖项列表(称为 observers),并通常通过调用其中一种方法自动通知它们任何状态变化。

Ruby 提供了一种实现 Observer 设计模式的简单机制。模块 Observable 提供逻辑以通知订户 Observable 对象中的任何更改。

为了使其工作,observable 必须断言它已经改变并通知观察者。

观察对象必须实现 update() 方法,该方法将是 Observer 的回调。

让我们实现一个小聊天,用户可以订阅用户,当其中一个人写东西时,订阅者会收到通知。

require "observer"

class Moderator
  include Observable

  def initialize(name)
    @name = name
  end

  def write
    message = "Computer says: No"
    changed
    notify_observers(message)
  end
end

class Warner
  def initialize(moderator, limit)
    @limit = limit
    moderator.add_observer(self)
  end
end

class Subscriber < Warner
  def update(message)
    puts "#{message}"
  end
end

moderator = Moderator.new("Rupert")
Subscriber.new(moderator, 1)
moderator.write
moderator.write

产生以下输出:

# Computer says: No
# Computer says: No

我们在 Moderator 类中触发了方法 write 两次,通知其订阅者,在这种情况下只是一个。

我们添加的订阅者越多,所传播的更改就越多。