微信号:ruby_and_rails

介绍:[Ruby程序员]旨在分享最新的Ruby & Rails,移动开发以及其他相关技术的分享,内容通俗易懂,有来自北京,上海,广州的技术达人不定期的分享.

观察者模式-ruby实现

2014-07-20 21:02 chenc

#encoding:utf-8

观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。
在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。
这通常透过呼叫各观察者所提供的方法来实现。

实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能
体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,
从根本上违反面向对象的设计的原则。无论是观察者“观察”观察对象,
还是被观察者将自己的改变“通知”观察者,都不应该直接调用。
module Subject
def initialize
puts "subject initialize.."
@observers = []
end

def add_observer ob
@observers << ob
end

def delete_observer ob
@observers.delete ob
end

def notify_observers
@observers.each do |ob|
ob.update self
end
end
end

#被观察者
class Employee
include Subject
attr_reader :name, :title
attr_reader :salary

def initialize name, title, salary
super()
puts "Employee initialize.."
@name = name
@title = title
@salary = salary
end

def salary=new_salary
@salary = new_salary
notify_observers
end
end

#观察者 税务员
class Taxman
def update obj
puts "Taxman: #{obj.name} now has a salary of #{obj.salary}"
end
end

#观察者
class Employer
def update obj
puts "Employer: #{obj.name} now has a salary of #{obj.salary}"
end
end

jack = Employee.new('jack', 'prgramer', 3000)
jack.add_observer(Taxman.new)
jack.add_observer(Employer.new)
jack.salary = 3000


# 观察者模式(ruby)的使用例子, ruby提供了observer更方便我们实现观察者模式
require 'observer'


# 被观察者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")

 
ruby程序员 更多文章 rails 中使用roo读取excel数据 ruby中的鸭子类型(duck type) Rails中如何使用jsonp实现跨域访问 一道笔试题 ruby设计模式-单例模式
猜您喜欢 程序员实力撩妹指南 【直播预告】北美微软 Ignite 技术大会 App环境分离的实现:Android篇 使用SVG中的Symbol元素制作Icon - 腾讯ISUX “容器的100定律”——Shopify是这么玩Docker的