Ruby设计模式开发实例:观察者模式实现解析
时间:2026-08-17 | 作者:实验室老王 | 阅读:0简单来说,观察者模式是在消息的生产者和消费者之间建立一个干净的接口(clean interface)。这样一来,生产者和消费者之间的耦合就会变得非常抽象。
被观察者根本不需要认识任何一个具体的观察者。它只知道,这些观察者都实现了一个共同的接口。
也正因为观察者和被观察者没有紧密绑定在一起,所以它们可以各自属于完全不同的抽象层次。
观察者模式的特性
观察者模式天然支持广播通信。被观察者会向每一个注册过的观察者发送变更通知。
但这条特性也有代价。一旦处理不当,观察者可能被循环通知,大量消耗系统资源。
观察者模式的两个核心角色
在广义的观察者模式中,有两个核心角色:
- 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
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 使用RVM切换Ruby与Rails版本的实现方法
- 时间:2026-08-18
-
- Ruby语言是什么及入门使用方法
- 时间:2026-08-18
-
- Ruby on Rails网站项目搭建入门指南
- 时间:2026-08-18
-
- Ruby插入排序算法实现与二路插入排序代码示例
- 时间:2026-08-18
-
- Ruby图片滤镜算法实现代码与核心原理
- 时间:2026-08-18
-
- Ruby中Hash哈希结构基本操作方法详解
- 时间:2026-08-18
-
- Ruby面向对象编程:类方法与类扩展详解
- 时间:2026-08-18
-
- Ruby正则表达式语法详解与常用示例代码
- 时间:2026-08-18
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15
