观察者模式(Observer Pattern)

定义

观察者设计模式也叫做发布-订阅(Publish-Subscribe)模式。有点像杂志订阅的意思,你向杂志社订阅杂志,然后提供了自己的姓名和邮箱地址,这样杂志社就可以把你所订阅的杂志推送到你的邮箱了,而你收到的杂志都是你自己订阅的,不会不是你订阅的,这就是一个观察者模式的例子。订阅杂志的过程简单来说就是一个观察者(订阅者)向某个杂志社(发布者)订阅特定的杂志,其静态关系图如下所示:

从抽象的角度来看,上图所示的观察者模式是Obsevers向Subject订阅特定的消息(即杂志),因此一旦Subject对象需要通知观察者某些变化的时候,Subject对象将会发送update消息给每个观察者,而这些观察者值得是所有存储在Subject对象的内部列表中的订阅者。观察者模式是一种简单直接的设计模式,Subject为那些实现了Observer协议并且需要使用update消息的对象提供了注册和反注册的功能。当Subject对象发生了一些变化后,它会给自己发送消息通知,然后通过特定的广播算法向所有注册了的Observer发送update消息,其时序图如下所示:

使用观察者设计模式的最明显的好处就是能够为Subject对象扩展N个观察者,一个Subject可以对应无限个观察者(无限也要考虑系统资源的),只需要注册即可。

补个观察者的官方定义吧:

适用场景

在程序设计中,将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便,观察者就是解决这类的耦合关系的。当出现以下情况的时候,你可以考虑考虑观察者模式了:

  • 当你有两个相互独立的抽象类的时候,通过把他们封装到一个独立的类之后,你依旧可以独立地变换以及重用他们。
  • 当一个对象的变换需要引起其他变换的时候,尤其是需要一系列的对象需要跟着变换
  • 当一个对象需要在不知道其他对象的具体情况而需要给他们发送通知的时候

CocoaTouch中的观察者模式

IOS开发过程中使用最多的MVC模式就包含了观察者设计模式,其中V(视图控制器)就是观察者,通过观察者设计模式,由于每个组件没有和其他组件存在多少的联系,因此他们可以自由地重用和扩展。

除了MVC设计模式,在Cocoa Touch的框架中,我们也能发现观察者设计模式的应用:Notifications和KVO(Key-Value Observer)

其中Notifications一般使用方法如下:

// 添加观察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeIntlCode:) name:NOTIFICATION_SUCCESS_SELECT_INTLCODE object:nil];

// 发出通知
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_SUCCESS_SELECT_INTLCODE object:nil userInfo:[NSDictionary dictionaryWithObject:model forKey:@"selectedIntlCodeModel"]];

// 移除观察者
[[NSNotificationCenter defaultCenter] removeObserver:self name:NOTIFICATION_SUCCESS_SELECT_INTLCODE object:nil];

KVO其实知识点比较多,这里也拿一些比较常见的代码来看看使用情况:

{
	book = [[Book alloc] init];

	// 通过setValue:forKey设置值
	[book setValue:@"18.8" forKey:@"price"];
	// 监视注册属性
	[book  addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];

	// ....

}

// NSKeyValueObserving定义的借口方法,重写实现回调方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if([keyPath isEqualToString:@"price"])
    {
		// 通过valueForKy获取值
        NSLog(@"%@", [book valueForKey:@"price"]);
    }
}

- (void)dealloc
{
    [super dealloc];
    [book removeObserver:self forKeyPath:@"price"];
    [book release];
}

代码示例

(续)

总结

观察者模式可以使得订阅者及时获取被观察者的变换情况,支持多个观察者,同时也降低了Subject和具体的Observer的耦合性。

时间: 2024-11-04 03:05:27

观察者模式(Observer Pattern)的相关文章

设计模式 - 观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权所有, 禁止转载, 如有转载, 请站内联系. 观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新. 使用方法: 1. 首先新建主题(subject)接口, 负责注册(register)\删除(remove

设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法

观察者模式(Observer Pattern) Java内置 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 观察者模式(observer pattern)详解, 参见: http://blog.csdn.net/caroline_wendy/article/details/26583157 Java内置的观察者模式, 是通过继承父类, 实现观察者模式的几个主要函数: Observerable(可被观

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

Observer Pattern 是一种常用的设计模式,它是一种事件监听模型.该模式有两个角色,一个是Subject, 另一个是Observer.Subject 保存有多个Observer的引用,一旦特定的事件发生,Subject会通知它所有的Observer,Observer得到该通知后执行相关程序逻辑.其中,Observer只有先向Subject注册后才能被Subject知晓.这就像订报纸,只有我们向出版社提出订报的申请,出版社才会把我们列入订阅者名单,然后每当新报纸印好时,出版社会通知订阅

设计模式 - 观察者模式(Observer Pattern) 详细说明

观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部, 禁止转载, 如有转载, 请站内联系. 观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的全部依赖者都会收到通知并自己主动更新. 用法: 1. 首先新建主题(subject)接口, 负责注冊(register)\删除(remo

jQuery中的观察者模式(Observer Pattern)

在jQuery中,on方法可以为元素绑定事件,trigger方法可以手动触发事件,围绕这2个方法,我们来体验jQuery中的观察者模式(Observer Pattern). ■ on方法绑定内置事件,自然触发 比如,我们给页面的body元素绑定一个click事件,这样写. <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title&

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

先看下观察者模式的定义: The Observer Pattern defines a one-to-many denpendency between objects so that when one object changes state, all of its dependents are notified and updated automatically.:观察者模式定义了对象间一对多依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新. 观察者模式又叫发布-

【设计模式】观察者模式 Observer Pattern

定义:观察者模式定义了对象之间的一对多依赖.当“主题”(Object)状态改变事,所有依赖它的“观察者”(Observer)都会受到通知并自动更新.主题支持观察者订阅和退订. 观察者模式提供了一种对象设计,让主题和观察者之间松耦合.改变主题或观察者一方不会影响另一方.因为两者是松耦合的. 参考: 设计模式学习笔记--Observer Pattern观察者模式

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

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之代理模式(Proxy Pattern)>http://blog.csdn.net/yanbober/article/details/45480965 概述 观察者模式用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作

我理解设计模式C++实现观察者模式Observer Pattern

概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设计我们的软件呢?我们能够这样:小明的全部client上都订阅中国证券这个股票,仅仅要股票一有变化,全部的client都会被通知到而且被自己主动更新. 这就是我们的观察者模式,她定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 全部依赖于它的对象都得到通知并被自己主动更新. 类图与实例:

设计模式----行为型模式之观察者模式(Observer Pattern)

下面是阅读<Head First设计模式>的笔记. 观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. JDK API内置机制 JDK1.0版本就已经包含了java.util.Observer和java.util.Observable,TODO. java.util.Observer是一个接口,所有使用内置机制实现观察者模式,都需要实现该接口.该接口只定义了一个方法 void update(Observable o, Object a