ruby设计模式-观察者模式
当一个对象的状态或者行为发生改变,需要即时通知到相关的其他对象当中的时候,我们会采用观察者模式来进行编写灵活的代码使得这个过程的耦合性降低,提高程序的可读性和扩展性。
?
?
module Observable def initialize @observers = [] end def add_observer &observer @observers << observer end def del_observer &observer @observers.delete(observer) end def notify @observers.each do |obs| obs.call end endendclass Newspaper include Observable attr_accessor :name, :price def initialize name, price super() @name = name @price = price end def change_order_price(price) @price = price notify end endperson1 = lambda do p "inform john"endperson2 = lambda do p "inform julia"endnewspaper = Newspaper.new("america newspaper", 20)newspaper.add_observer &person1newspaper.add_observer &person2newspaper.change_order_price(20)
?
?
观察者模式分为推模式和拉模式,借用他人的话来阐述加深记忆
推,即发布者通过调用观察者提供的接口,来通知观察者一些变动(比如新增一个消息)。?
拉,即观察者可以自主提取所要接受的数据,而不是全盘接受,主要体现在观察者程序自己主动调用观察者的传值接口,而区别于推由发布者来调用,此时,需要这个接口中的参数包含发布者对象,让程序知道扫描变动来自于哪个发布者。
推和拉的一个很重要的区别是在于对被观察者的数据的提取是否是全盘或者是局部,如果是局部提取,也就是观察者的接收通知接口方法中的参数需要将发布者本身对象传递进去,让观察者自行对发布者的数据进行提取或者是操作。
?
避免滥用:需要对被观察者自身状态的改变进行一些明确规定,并不是一旦被观察者的状态或者行为被调用之后就去通知观察者,而是考虑是否真的需要通知观察者,所以在通知观察者的方法当中应该进行明确限定,如果没有发生任何改变或者根本不必去通知观察者的时候完全应该不去notify。