首页 分类 关于我
ruby
Nginx 配置示例 工程师的产品观 理理File/Dir/Pathname(一) TracePoint介绍 ruby中的return 如何动态改变某个class的祖先链 ObjectSpace介绍 Rails日志实现探索(3) Rails日志实现探索(2) Rails日志实现探索(1) Rails中的request rescue exception in ruby 设计模式之观察者模式 require 的故事 ruby中的编码 研究ruby的一些小技巧 Rails中间件 ruby对象的序列化 ActiveSupport宝藏之MessageVerifier 如何写rakefile Ruby on Rails 环境及准备 基于Rack的项目初始化
git
如何移除某次提交之前的版本历史 Git 不常用的好用的命令 Git高级技巧之忽略文件
database
Mysql数据库编码 从mongodb向mysql迁移数据
工具
搭建ipsec服务
linux
Linux 常用查看命令

设计模式之观察者模式

举这么个例子,假定你娶了个贤惠的小媳妇,小媳妇最喜欢的事情就是“你发工资了”,银行为你的工资卡提供了一个“余额变化提醒”的功能,于是小媳妇把她的手机号设成了通知手机,你发工资了这个事件小媳妇就会第一时间知道。

在这个过程中:

  • “观察者(Observer)”是小媳妇;
  • “观察者目标”是你;
  • “观察事件”是你发工资了;
  • “发布通知者”是银行。

观察者一般可以不止一个,假定你还有个小情人(女儿),小情人最喜欢的事情也是你“发工资了”,小情人也可以成为你的观察者。

观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知。

下面我们利用ruby标准库中自带的observer库来实现一个观察者模式的范例。

require 'observer'

# 被观察者
class ObservableTarget
  include Observable
end

# 观察者-小媳妇
class ObserverWife

  # update方法是回调方法,notify_observers时调用
  def update(arg)
    puts "通知小媳妇" + arg
  end

end

# 观察者-小情人
class ObserverDaughter

  def update(arg)
    puts "通知小情人" + arg
  end

end

调用代码

# 被观察者初始化
target = ObservableTarget.new

# 观察者初始化
wife = ObserverWife.new
daughter = ObserverDaughter.new

# 添加监视对象 小媳妇
target.add_observer(wife)

# 被观察者改变了
target.changed

# 通知观察者
target.notify_observers("发工资了")
# => 通知小媳妇发工资了

# 添加监视对象 小情人
target.add_observer(daughter)

# 被观察者改变了
target.changed

# 通知观察者
target.notify_observers("发工资了")
# => 通知小媳妇发工资了
# => 通知小情人发工资了

© 2018 www.xinshengyin.com All rights reserved.

版权所有