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

一般来说,观察者模式的定义应该是这样的:building a clean interface between the source of news that some object has changed and the consumers of that news。

观察者模式在消息的生产者和消费者之间建立了clean interface,这样就使得消息的生产者和消费者之间的耦合是抽象的。被观察者可以不认识任何一个的观察者,它只知道他们都实现了一个共同的接口。由于观察者和被观察者没有紧密的耦合在一起,所以他们可以属于不同的抽象层次。

观察者模式支持广播通信,被观察者会向每个注册了的观察者发送广播的change消息。这种广播模式就有可能导致观察者被循环通知,消耗极多的资源。

广义的观察者模式中应该定义2个角色。

Subject:产生消息的类就是subject。在上一篇的例子中就是Tester类;

Observer: 对subject产生的消息感兴趣的类。在上篇的例子中就是税务局,社保局类;

若是以男女关系来类比subject和observer,subject就应该是observer这个男孩子暗恋的女孩。男孩对女孩痴心一片,但是女孩总是若近若离,遮遮掩掩。于是男孩对女孩说:我会等你的,如果你有了归宿请通知我,否则我一直等下去。在这里男孩就是女孩的observer,他对女孩产生的消息——是否有了归宿感兴趣。于是当有了归宿这个消息产生时,女孩会通知男孩,一个爱情杯具诞生,但是完整的observer模式会完美实现。

作为subject,下面的这些接口是其应该实现的:

  • 增加observer
  • 移除observer
  • 通知observer

而作为observer,其需要实现接收通知时候的具体表现。

示例:
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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索设计模式
, ruby
观察者模式
java观察者模式实例、js 观察者模式 实例、观察者模式实例、php 观察者模式实例、观察者模式的实例,以便于您获取更多的相关知识。

时间: 2024-11-08 22:52:42

实例解析Ruby设计模式开发中对观察者模式的实现_ruby专题的相关文章

实例解析Ruby设计模式编程中Strategy策略模式的使用_ruby专题

今天你的leader兴致冲冲地找到你,希望你可以帮他一个小忙,他现在急着要去开会.要帮什么忙呢?你很好奇. 他对你说,当前你们项目的数据库中有一张用户信息表,里面存放了很用户的数据,现在需要完成一个选择性查询用户信息的功能.他说会传递给你一个包含许多用户名的数组,你需要根据这些用户名把他们相应的数据都给查出来. 这个功能很简单的嘛,你爽快地答应了.由于你们项目使用的是MySQL数据库,你很快地写出了如下代码: require 'mysql' class QueryUtil def find_us

详解Ruby设计模式编程中对单例模式的运用_ruby专题

简介      单例模式是设计模式中最简单的形式之一.这一模式的目的是使得类的一个对象成为系统中的唯一实例.要实现这一点,可以从客户端对其进行实例化开始.因此需要用一种只允许生成对象类的唯一实例的机制,"阻止"所有想要生成对象的访问.使用工厂方法来限制实例化过程.这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义. 要点      显然单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例.      

解析proxy代理模式在Ruby设计模式开发中的运用_ruby专题

代理模式Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上.在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层.如下图:     比如说C和A不在一个服务器上,A要频繁的调用C,我们可以在A上做一个代理类Proxy,把访问C的工作交给Proxy,这样对于A来说,就好像在直接访问

实例解析Java设计模式编程中的适配器模式使用_java

平时我们会经常碰到这样的情况,有了两个现成的类,它们之间没有什么联系,但是我们现在既想用其中一个类的方法,同时也想用另外一个类的方法.有一个解决方法是,修改它们各自的接口,但是这是我们最不愿意看到的.这个时候Adapter模式就会派上用场了. Adapter模式也叫适配器模式,是由GoF提出的23种设计模式的一种.Adapter模式是构造型模式之一,通过Adapter模式,可以改变已有类(或外部类)的接口形式. 适配器 模式 有三种方式,一种是对象适配器,一种是类适配器, 一种是接口适配器以下举

实例解析C++设计模式编程中简单工厂模式的采用_C 语言

简单工厂模式中专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.它又称为静态工厂方法模式,属于类的创建型模式. 简单工厂模式的UML类图 简单工厂模式的程序通过封装继承来降低程序的耦合度,设计模式使得程序更加的灵活,易修该,易于复用. 简单工厂是在工厂类中做判断,从而创造相应的产品. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例.   该模式中包含的角色及其职责   1.工厂(Creator)角色  

ruby、javascript、php中的观察者模式实现代码_ruby专题

面试被问及到js中的观察者模式,这玩意儿早就了解过,可以说是动态语言中非常有用的一个设计模式,非常惭愧的没有系统的研究过.不过没关系,哪里不会补哪里,立刻动手,用所会的语言都实现一遍. 观察者模式 关于观察者模式,<松本行弘的程序世界>讲的非常清楚:观察者模式是当某个对象状态发生变化时,依存于该状态的全部对象自动得到通知,被观察者和观察者们是一对多的关系.书中还举了一个非常易懂的例子:获取系统当前时间并输出到命令行中.如果要硬编码也很简单,定义一个方法,先获取时间,然后再处理展示.这样获取时间

Java设计模式开发中使用观察者模式的实例教程_java

观察者模式是软件设计模式中的一种,使用也比较普遍,尤其是在GUI编程中.关于设计模式的文章,网络上写的都比较多,而且很多文章写的也不错,虽然说有一种重复早轮子的嫌疑,但此轮子非彼轮子,侧重点不同,思路也不同,讲述方式也不近相同.关键要素 主题: 主题是观察者观察的对象,一个主题必须具备下面三个特征. 持有监听的观察者的引用 支持增加和删除观察者 主题状态改变,通知观察者 观察者: 当主题发生变化,收到通知进行具体的处理是观察者必须具备的特征. 为什么要用这种模式 这里举一个例子来说明,牛奶送奶站

在Ruby on Rails中优化ActiveRecord的方法_ruby专题

 Ruby on Rails 编程常常会将您宠坏.这一不断发展的框架会让您从其他框架的沉闷乏味中解脱出来.您可以用习以为常的几行代码片断表达自己的意图.而且还可以使用 ActiveRecord. 对于我这样的一个老 Java? 程序员而言,ActiveRecord 多少有点生疏.通过 Java 框架,我通常都会在独立的模型和模式之间构建一种映射.像这样的框架就是映射框架.通过 ActiveRecord,我只定义数据库模式:或者用 SQL 或者用称为迁移(migration)的 Ruby 类.将对

在Ruby on Rails中使用Markdown的方法_ruby专题

实现 Markdown 语法和代码语法高亮分别是用的 Redcarpet 和 pygments.rb 两个 Gem:     https://github.com/vmg/redcarpet     https://github.com/tmm1/pygments.rb     https://github.com/richleland/pygments-css     http://pygments.org/docs/lexers/ 在/Gemfile中添加如下两行: gem 'redcarp