位置:首页 > Ruby > Ruby设计模式开发实例:观察者模式实现解析

Ruby设计模式开发实例:观察者模式实现解析

时间:2026-08-17  |  作者:实验室老王  |  阅读:0

简单来说,观察者模式是在消息的生产者和消费者之间建立一个干净的接口(clean interface)。这样一来,生产者和消费者之间的耦合就会变得非常抽象。

被观察者根本不需要认识任何一个具体的观察者。它只知道,这些观察者都实现了一个共同的接口。

也正因为观察者和被观察者没有紧密绑定在一起,所以它们可以各自属于完全不同的抽象层次。

实例解析Ruby设计模式开发中对观察者模式的实现

观察者模式的特性

观察者模式天然支持广播通信。被观察者会向每一个注册过的观察者发送变更通知。

但这条特性也有代价。一旦处理不当,观察者可能被循环通知,大量消耗系统资源。

观察者模式的两个核心角色

在广义的观察者模式中,有两个核心角色:

  • Subject:产生消息的类就是 Subject。在上篇例子中对应的是 Tester 类;
  • Observer:对 Subject 产生的消息感兴趣的类。上篇例子里的税务局、社保局就是 Observer。

形象理解观察者模式

如果非要用男女关系来类比,Subject 就像那个男孩子暗恋的女孩。男孩对她痴心一片,女孩却总是若近若离、遮遮掩掩。

于是男孩说:“我会一直等你,如果你有了归宿请通知我,否则我就一直等下去。”

在这个场景里,男孩就是女孩的 Observer。他对女孩“是否有了归宿”这条消息感兴趣。

当归宿确实到来时,女孩会通知男孩。虽然爱情杯具在所难免,但完整的观察者模式也因此被完美演绎。

Subject 和 Observer 需要实现什么

作为 Subject,下面这些接口是其必须要实现的:

  • 添加 observer
  • 移除 observer
  • 通知 observer

而作为 Observer,只需要实现收到通知时的具体表现。也就是定义自己的 update 方法。

Ruby 中的实现方式

示例:Ruby 自带的 Observer 模块已经帮我们实现了观察者模式的核心机制,直接拿来用就好。

代码例子:

# -*- coding: GB2312 -*- 
 
require 'observer' 
# 观察者模式(ruby)的使用例子 
 
# 被观察者P 
class PObservable 
include Observable 
 
end 
 
# 观察者A 
class AObserver 
# update方法名是必须的要有的 
def update(arg) 
  puts "AObserver 被通知了 " + arg 
end 
end 
 
# 观察者B 
class BObserver 
# update方法名是必须的要有的 
def update(arg) 
  puts "BObserver 被通知了 " + arg 
end 
end 
 
# 观察者初始化 
observer_a = AObserver.new 
observer_b = BObserver.new 
 
# 被观察者初始化 
obj = PObservable.new 
 
# 添加监视对象 
obj.add_observer(observer_a) 
obj.add_observer(observer_b) 
 
# 被观察者改变了 ->这段代码 必须有 不然无法通知到观察者 
obj.changed 
 
# 通知观察者 
obj.notify_observers("Test") 
 

输出结果:

AObserver 被通知了 Test
BObserver 被通知了 Test

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多