`
a420144030
  • 浏览: 83702 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Observer 的使用

阅读更多

声明:此帖抄录别人的

原帖地址:http://www.iteye.com/topic/508577

Observer 类会对外部的原始类内在生命周期内实现触发行为的“回调”做出反应。当一个“模型”类担负了不是它的核心职责的功能时,使用这种方式就会减少混乱。

 

 

从上面说明中可以看出,Observer 类是对Callbacks 类的一种变相的补充。补充的原因是因为有些“模型”为了迁就Callbacks 而做了自己不该做的事。而Observer 类就是把原来要写在“模型”中的Callbacks 的方法抽取出来,并在类中指出它要监视这个“模型”对象与Callbacks 有关的活动。

 

Observer 允许你注入行为到“模型”类中,而不用修改这些类内的任何代码。

 

一个“观察者”显示地连接本身到一个“模型”类中,为了回调注册它自己为“模型”的一部分,但是并不要求“模型”本身做任何更改。

 

例如:

 

class CommentObserver < ActiveRecord::Observer

def after_save(comment)

Notifications.deliver_comment("admin@do.com",

"New comment was posted", comment)

end

end

 

Comment#save 执行完成时,这个Observer 发送一个电子邮件。

 

class ContactObserver < ActiveRecord::Observer

def after_create(contact)

contact.logger.info('New contact added!')

end

def after_destroy(contact)

contact.logger.warn("Contact with an id

of #{contact.id} was destroyed!")

end

end

 

这个Observer 在指定的回调被触发时,使用logger 来日志。

 

ActiveRecord::Observer 被子类化时,它查看新类名字,从尾部剥去单词Observer ,并且假设左侧是被观察的“模型”类的名字。在我们的例子中,我们称我们的“观察者”类为ContactObserver ,所以它自动地把它自己同“模型”Contact 钩住。

 

 

一、观察不能被推断的类

 

缺省地,Observer 映射与其共享同一名字的类。所以CommentObserver 会与“观察者”Comment 紧密联在一起,ProductManagerObserverProductManager ,等等。如果你想有与你观察的类不同的名字的Observer ,你可以使用Observer.observe 类方法。

 

也就是说,Observer 类可以使用observer() 方法明确地列出了它想观察的“模型”。

 

class AuditObserver < ActiveRecord::Observer

observe Account

 

def after_update(account)

AuditTrail.new(account, "UPDATED")

end

end

 

如果audit “观察者”需要观察多个种类的对象,这可以指定多个参数:

 

class AuditObserver < ActiveRecord::Observer

observe Account, Balance

 

def after_update(record)

AuditTrail.new(record, "UPDATED")

end

end

 

现在,AuditObserver 将对AccoutBalance ,它们约定的record 的更新做出反应。

 

 

二、利用回调方法

 

Observer 可以为Callbacks 模块内描述的每个方法实现回调方法。

 

 

三、存储ObserverRails

 

如果你在Rails 内使用了“活动记录”,则Observer 类通常以app/models/audit_observer.rb 名字约定被存储在app/models 目录内。

 

 

四、配置

 

为了激活一个Observer ,你需要在config/environment.rb 文件内设置config.active_record.observers 配置。

 

config.active_record.observers = :comment_observer,

:signup_observer

 

除非你在你的应用程序配置中定义这些,否则Observer 将不会被调用。

 

也就是说,我们必须创建一个“观察者”实例—只定义“观察者”类是不能完成观察的。对标准的“活动记录”应用程序来说,你还需要在初始化期间,在某些方便的地方调用instance() 方法。如果你写一个Rails 应用程序,你将在你的ApplicationController 内使用observer 指令,

 

五、Observer 生成器

 

在提示符窗口输入script/generate observer User ,可以在app/models 目录下创建一个UserObserver 框架。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Android observer 使用demo

    在提供的压缩包文件"SubjectObserverDemo"中,很可能包含了一个关于Observer模式的实战例子,可能涵盖了ContentObserver和BroadcastReceiver的使用,通过查看这个示例项目,你可以更深入地理解如何在Android应用中...

    react-intersection-observer:Intersection Observer API的React实现,以告诉您元素何时进入或离开视口

    准备测试-嘲笑路口观察器,以便通过轻松进行测试 :deciduous_tree: 可摇树-仅包括您使用的零件 :collision: 很小的束安装使用安装: yarn add react-intersection-observer 或NPM: npm install react-intersection...

    Observer模式

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

    Observer设计模式实例

    另一个例子是在多线程环境中,一个线程的状态变化可能需要通知其他线程,这时也可以使用Observer模式。 文件名"ObserverTest"可能表示这是一个关于Observer设计模式的测试代码。在实际编程中,这样的测试文件通常会...

    Observer模式代码实现

    本例展示了如何使用观察者模式来实现对象之间的松耦合。通过定义抽象的 `Subject` 和 `Observer` 类,可以很容易地扩展新的被观察者和观察者类型。此外,通过将观察者添加到被观察者列表中,并在被观察者状态变化时...

    观察者模式,Observer

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...在使用观察者模式时,需要注意这些因素并进行适当的优化。

    C++、MFC源代码observer

    在C++和MFC中实现Observer模式,可以使用STL(Standard Template Library)的容器,如std::vector或std::list,或者使用MFC提供的容器类。同时,需要注意的是,为了保证线程安全,可能需要在多线程环境中使用互斥量...

    Observer_exsample_observer_观测器_观测_状态观测器_

    在这个Observer_exsample_observer案例中,我们关注的是如何使用Simulink来设计和仿真一个状态观测器,特别是针对弹簧阻尼系统的应用。 首先,让我们了解一下状态观测器的基本原理。在控制系统中,我们通常只能获得...

    observer观察者模式

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这常用于实现事件驱动编程,使得系统能够及时响应变化。 在...

    Observer例子

    在Java中,我们可以使用Java内置的`java.util.Observable`类和`java.util.Observer`接口来实现Observer模式。主题类通常继承`Observable`,而观察者则实现`Observer`接口。当主题状态改变时,调用`Observable`的`...

    Observer and Reactor 观察者和recator的比较

    在选择使用哪种模式时,开发者需要考虑系统的性能需求、扩展性、可维护性以及资源限制。Observer模式更注重于对象之间的通信和状态传播,而Reactor模式则关注于事件的管理和调度。在设计实时系统时,理解这两种模式...

    我的图像处理工具-Observer

    在多年的图像处理工作中, 深感有必要自己开发一个开发一个集图像的显示, 变换, 各种处理分析测试的工具平台, 这就是Observer. 取名为Observer, 是因为我觉得图像的处理与分析依赖于对图像的细致观察. Observer的...

    Observer代替EventBus

    本文将深入探讨如何使用`Observer`代替EventBus来实现通知更新UI的功能。 首先,让我们了解`Observer`模式的基本概念。`Observer`模式是一种行为设计模式,允许一个对象(观察者)在状态改变时自动通知其他对象(被...

    C++ Observer 实现

    "C++ Observer"实现是面向对象编程中的一种经典设计模式,主要用于建立一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这篇博文通过链接深入探讨了C++中...

    ObserverPattern

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,属于对象交互模式。它定义了对象之间的一对多依赖关系,当一...在设计和开发过程中,正确地使用观察者模式可以帮助我们构建更加健壮和易于维护的系统。

    observable-observer

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察者”对象,使它们能够自动更新自己。在Java中,`Observable`类和`Observer`接口是内置的实现,...

    MC_State_Observer.rar_MC_State_Observer_MC_State_Observer.c_obse

    意法半导体公司关于电机控制器的源代码程序,此为其中的观测器源代码

    C++ Observer模式

    在C++中实现Observer模式,可以使用抽象基类来定义主题和观察者的接口。例如,可以有一个`Subject`抽象类,包含`attach`、`detach`和`notify`等方法,用于管理观察者。同时,还有一个`Observer`抽象类,包含`update`...

    Observer.zip

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于事件处理、发布/订阅...

    NewX_CodeProj_Observer.zip

    在.NET框架中,我们可以使用不同的方式来实现观察者模式,本项目“NewX_CodeProj_Observer.zip”中提供了三种实现方式:使用事件和委托、使用IObservable接口以及纯面向对象的实现。 1. 使用事件和委托...

Global site tag (gtag.js) - Google Analytics