`
Goldice
  • 浏览: 104599 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

#每天一种设计模式# 观察者模式

阅读更多

 

 

系统常常会出现这种情况:

每一个部分需要知道整体的状态。比如Excel中,当你修改了一个单元格的值,可能横列的sum需要改变,纵列的sum需要改变,根据这个单元格做的图需要改变,是否被修改的按钮需要激活... 如果没有一种很好的处理方式,导致的结果将是系统 highly integrated。

 

仔细分析,比如Excel的单元格,我们可以抽象出单元格是a source of news ,而其他部门是 receiver,接受单元格的改动的通知,然后进行自己的处理。

比如,单元格修改之后,通知计算总和的类来做相应的处理。

 

 

class Excel
         attr_reader :cell
         def initialize(value,sum)
               @cell = value
               @sum = sum
         end
         def cell=(value)
               @cell = value
               @sum.update
         end
end

class Sum
         def update
               puts "Got Excel Cell Changed"
         end
end

sum = Sum.new
excel = Excel.new(10,sum)
excel.cell = 11

 

在这个例子上,这一切完全ok。但是唯一的缺点是,Excel和Sum之间是硬连接(hard-wired)。比如,当cell改变的时候,除了Sum类,Graph类也需要得到通知,在这个例子上,我们只能修改cell=(value)这个函数。改动量的确不是很大,不过,Excel类并没有真的改变,只是因为增加一个receiver,却需要修改source所在的类。这总是有些不太合理吧。

 

      ok,让我们把事情做的彻底一点。

 

 

class Excel 
         attr_reader :cell
         def initialize(value)
               @cell = value
               @observers = []
          end
          def cell=(value)
                @cell = value
                notify_observers
           end
           def notify_observers
                 @observers.each do |observer|
                        observer.update
                  end
           end
           def add_observer(observer)
                  @observers << observer
           end
           def delete_observer(observer)
                   @observers.delete(observer)
            end
end

class Sum
         def update
               puts "Got Excel Cell Changed"
         end
end

sum = Sum.new
excel = Excel.new(10)
excel.add_observer(sum)
excel.cell = 11

      通过这种方式,source不需要知道有多少receiver对它感兴趣,而增加一个新的receiver也只需要调用add_observer方法即可。

      这样Observer模式的结构就已经展现在眼前了。

 


GoF把source叫为subject class,而receiver较为observers.

 

the Ruby standard library 提供了一个Observable module让我们可以轻松实现Observer模式。

 

 

 

  • 大小: 15 KB
分享到:
评论

相关推荐

    设计模式系列之观察者模式

    观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件...

    java23种设计模式之观察者模式

    定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

    18种C++版设计模式

    工厂,状态,观察者等18种设计模式 每一种设计模式有详细介绍,代码(C++),UML图工厂,状态,观察者等18种设计模式 每一种设计模式有详细介绍,代码(C++),UML图工厂,状态,观察者等18种设计模式 每一种设计...

    观察者模式的一个应用

    观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。...

    设计模式之观察者模式(Observer)

    观察者模式(Observer) 用意:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。

    java23种设计模式

    java23种设计模式,每一种模式都有详细的讲解,很全面,如果你想深入了解一下java23种设计模式,这会非常适合你的哦!上传乃为百度云连接,失效请留言。 内容: 001策略模式! N. B8 ~' D! f9 j+ g0 I 002观察者模式 ...

    设计模式之观察者模式1

    设计模式之观察者模式介绍观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个

    C++设计模式--观察者模式 demo

    观察者模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

    Android,设计模式,观察者模式

    观察者模式定义对象间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。这里演示了通过改变一个数值来改变多个视图组件的显示。现在本人也处于学习阶段,不足之处,敬...

    java 设计模式 观察者 源码

    观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件...

    观察者模式

    观察者设计模式观察者模式(有时又被称为发布-订阅模式、模型-视图模式、源-收听者模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时...

    Observer 观察者模式 示例 源码 ----设计模式

    观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...

    java观察者模式实例

    观察者模式实例,用到java的继承,多态,加深概念理解.

    观察者设计模式

    这是李兴华观察者设计模式的课件,对一种设计模式的分析,非常好

    Java设计模式——观察者模式

    Java设计模式——观察者模式的两种情况。

    Java内置观察者模式

    观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化,这个例子是java内置观察者模式

    软件体系结构与设计模式_观察者模式

    定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。

    23种Python设计模式示例演示源码包.rar

    23种Python设计模式示例...Interpreter解释器模式,Iterator迭代器模式,Mediator中介者模式、Singleton光身汉模式,Observer观察者模式等,一共23种,这里不一一列举了,每一种模式代码,都包括了中文注解,利于学习。

    JAVA23种设计模式及快捷记忆

    (11种)策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式 情景记忆:一个**访客**来到一家房屋**中介**门口,正在**观察**宣传...

    设计模式自己总结一句话描述

    行为型模式,共十一种: 策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。

Global site tag (gtag.js) - Google Analytics