`

设计模式与动态语言 之 Observer

阅读更多
观察者模式也是属于对象行为型模式,它的别名有:依赖(Dependents)、发布-订阅(Publish-Subscribe;在实际开发中,使用非常频繁。


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

动机:将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,因为这样降低了他们的可重用性。


解决的问题:减少耦合度

结构:



适用性:
  • 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
  • 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
  • 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。


下面再讲下动态性:
Rails 里面,自带的库就有很多是用这个模式,下面举个例子:

class Observer
  include Observable
  
  attr_reader :name
  
  def initialize(name)
    super()
    @name = name
  end
  
  def see_man
    puts self.name
    puts "I see police man, call yashiro now."
    changed
    notify_observers(self)
  end
end


使用后的效果:
  • 目标和观察者的抽象耦合
  • 支持广播通信
  • 意外的更新


误用:
  • 循环调用,导致系统崩溃;
  • 通知异步,小心你期望的顺序;
  • 更新事件和状态改变是两码事;



看到这里,可能会觉得观察者模式和模板方法(的钩子)很像,下面讲下区别:
相同:都是为了让其对象了解事件的发生;
不同:模板方法只对其了解的对象(子类的对象)起作用;


下面做个demo:



rails observe_demo

ruby script/generate model FavorableType name:string rate:decimal

rake db:create:all

rake db:migrate




加文件 app/models/favorable_type_observer.rb
class FavorableTypeObserver < ActiveRecord::Observer
  observe FavorableType

  def after_create(favorable_type)
    notify
  end

  def notify
    puts "通知所有客户有新的优惠 #{favorable_type.name}..."
  end
end


ruby script/console

FavorableType.create(:name => '满400还200')



类图:

  



  • 大小: 52 KB
  • 大小: 22.7 KB
分享到:
评论
2 楼 jim.jin 2009-11-26  
谢谢提醒。
1 楼 open2ye 2009-11-26  
有错别字 有错别字

相关推荐

    Observer设计模式实例

    Observer设计模式,也被称为“发布-订阅”(Publish-Subscribe)模式或“依赖倒置”模式,是软件设计中的一种行为模式。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...

    设计模式-Java语言中的应用(pdf)

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...

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

    观察者模式,也被称为发布-订阅模式或事件驱动模式,是软件设计模式中的一种行为模式。这个模式的主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

    Java设计模式 设计模式介绍

    1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、...

    OBserver模式设计实现

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java和C++等面向对象编程语言中,这种模式广泛用于事件处理和实时系统,...

    Observer模式

    Observer模式,也被称为“发布-订阅”模式,是软件设计模式中的行为模式之一。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。Observer模式是实现...

    设计模式在java语言中的运用 书籍

    在Java语言中,设计模式的应用广泛且深入,它们是Java开发人员必备的技能之一。这本书籍《设计模式在Java语言中的运用》可能会详细探讨23种GOF(Gang of Four)经典设计模式,并结合Java特性进行解释。 首先,我们...

    人人都懂设计模式 人人都懂设计模式

    在本书中,作者使用了轻松、有趣的语言来讲解设计模式,通过故事和示例来帮助读者更好地理解设计模式的思想和方法论。作者还提供了详细的代码实现和示例,帮助读者更好地掌握设计模式的应用。 本书是一本非常实用的...

    设计模式 在java语言中的应用

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。在Java编程语言中,设计模式的应用可以极大地提升代码的可读性、可维护...因此,深入理解和应用设计模式是每个Java开发者必备的技能之一。

    24种设计模式以及混合设计模式

    通过学习和应用这些设计模式,开发者不仅可以提高代码的可读性、可维护性和可扩展性,还能提升团队间的沟通效率,因为设计模式是软件工程中的通用语言。对于任何有志于提升软件开发水平的人来说,理解和掌握设计模式...

    设计模式之美—学习笔记

    设计模式之美在于它们是软件设计的通用语言,无论你使用哪种编程语言,都能通过这些模式与他人进行有效的沟通。通过深入学习和实践,我们可以不断提升自己的设计能力,写出更加优雅、高效和可复用的代码。记住,设计...

    详解C#委托,事件,Observer设计模式

    Observer设计模式是软件工程中常用的设计模式之一,它定义了对象之间的一对多依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在C#中,事件和委托是实现Observer模式的有效...

    java的设计模式 《设计模式-java语言中的应用.pdf》

    《设计模式——Java语言中的应用》这本书深入探讨了如何在Java中有效地运用这些模式。 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。在Java中,可以通过双重检查锁定(Double-Checked Locking)或...

    java设计模式;java语言描述;经典的设计模式

    Java的面向对象特性,如封装、继承和多态,与设计模式的理念相辅相成,使得Java成为学习设计模式的绝佳平台。 在Java设计模式中,有三大类模式:创建型模式、结构型模式和行为型模式。每种模式都针对软件设计的不同...

    设计模式:Java语言中的应用.zip

    在Java语言中,设计模式的应用广泛且至关重要,因为它们能帮助开发者遵循良好的编程原则,如开闭原则、单一职责原则、依赖倒置原则等。 首先,我们来看一些基本的设计模式类型: 1. 创建型模式:这类模式主要处理...

    JavaScript设计模式.pdf

    JavaScript设计模式是指在软件开发中使用JavaScript语言编写的设计模式。这些设计模式旨在提高代码的重用性、可读性、维护性和扩展性。以下是JavaScript设计模式的知识点总结: 1. 单体模式(Singleton Pattern)...

    GOLF设计模式(C++语言版)

    目 录 序言 前言 读者指南 第1章 引言 1 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244

    JavaScript 设计模式 azw3

    《JavaScript设计模式》是JavaScript设计模式的学习指南。全书分为14章。首先介绍了什么是模式、模式的结构、类别...通过阅读本书,他们将能够提高对设计模式的认识,并学会如何将设计模式应用到JavaScript编程语言中。

    23种面向对象设计模式

    文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...

Global site tag (gtag.js) - Google Analytics