设计模式IOS篇-第三章:观察者模式

观察者模式在IOS中也是总要的一种模式,被观察的对象会告诉观察它的对象发生的一些变化,这里会分为两个实现类和两个接口

下面的一个Subject类,包含两个委托ObjectDelagate和SubjectDelegate

//Subject.h
#import <Foundation/Foundation.h>

//观察者委托
@protocol ObserverDelegate

@required
-(void)update;

@end

//被观察者委托
@protocol SubjectDelegate

@required
-(void)addObserver:(id<ObserverDelegate>)observer;
-(void)removeObservers:(id<ObserverDelegate>)observer;

@end

@interface Subject : NSObject<SubjectDelegate>

+(Subject *)shareManager;

@end

//Subject.m
#import "Subject.h"

@interface Subject()
@property(weak,nonatomic)NSMutableArray *observers;
@end

@implementation Subject

static Subject *subject = nil;

+(Subject *)shareManager
{
    static dispatch_once_t one;
    dispatch_once(&one,^{
        subject = [[Subject alloc]init];
    });

    return subject;
}

-(void)addObserver:(id<ObserverDelegate>)observer
{
    [self.observers addObject:observer];
}

-(void)removeObservers:(id<ObserverDelegate>)observer
{
    [self.observers removeObject:observer];
}

@end

下面的是Observer类

//Observer.h
#import <Foundation/Foundation.h>
#import "Subject.h"

@interface Oberver : NSObject<ObserverDelegate>

@end

//Observer.m
#import "Oberver.h"

@implementation Oberver

-(id)init
{
    self = [super init];
    if(self)
    {
        //获取到Subject的单例,然后进行观察(加入到被观察者中,如果有变化,会调用观察者的update方法)
        [[Subject shareManager]addObserver:self];
    }
    return self;
}

-(void)update
{

}

@end

在IOS中,有两个这样的机制是实现了观察者模式,通知(notification)机制和KVO(Key-Value Observing) 机制,下面简要介绍这两种机制。

通知机制

通知机制最主要的类是NSNotificationCenter,是单列模式。获取它的单列是[NSNotificationCenter defaultCenter],addObserver是添加观察者对象,selector是接收到通知时处理的方法,name是等待何种命令,object是接收到的数据。在下面的例子中的意思是,把自己当前的类(self)作为观察者,当某地发出"AppWillTerminateNotification"的通知的时候由观察者(self)中的handleTerminate的方法去处理接收到的通知。

[[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(handleTerminate:)
            name:@"AppWillTerminateNotification"
            object:nil];

下面这个是发出通知的方法,postNotificationName是发出通知的名字,object是发出通知的对象,userInfo是发出通知附带的字典,通常用于传递参数

//传参的字典
NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
[dict setValue:@"Hello" forKey:@"TalkToYou"];

//发出的通知,发出名字为AppNotification的通知
[[NSNotificationCenter defaultCenter]postNotificationName:@"AppNotification" object:self userInfo:dict];
//下面这种是可以不带userInfo的
[[NSNotificationCenter defaultCenter]postNotificationName:@"AppNotification" object:self];

在通知到的对象里面,需要实现通知到的时候实现的方法(这个方法名字是在添加观察者的时候定义的)可以从里面获取到传递的参数

-(void)action:(NSNotification *)note
{
    NSDictionary *dict = [note userInfo];
    if (dict != nil) {
        [dict objectForKey:@"Hello"];
    }

}

KVO机制

KVO机制跟通知机制有点不一样,KVO机制是当对象的某个属性更改时,直接通知观察者成员

先来看看被观察者需要写的代码部分,addObserver这里先要获取到一个观察者的对象,forKeyPath就是被观察对象的一个key,options属性变化的选项,context就是上下文,以下这句代码的意思是,被观察者通知Observer对象类,我的其中一个属性,key为"appStatus"被更改了

Observer *observer= [Observer new];
[self addObserver:subject forKeyPath:@"appStatus" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"Pass Context"];

当发出了通知之后,观察者类会收到通知,执行一下的方法,这个方法不需要继承任何的委托,继承至NSObject的所有类都会自动继承了一下的这个方法,这个方法中,keyPath就是属性的Key,ofObject就是被观察者对象,change就是一个传递的值的数据字典,context就是传递的上下文

- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object
    change:(NSDictionary*)change context:(void*)context
{
    NSLog(@"Property ‘%@‘ of object ‘%@‘ changed: %@context: %@",keyPath,object,change,context);
}
时间: 2024-10-13 16:09:11

设计模式IOS篇-第三章:观察者模式的相关文章

IOS开发之国际化篇第三章:故事版文本国际化

在IOS的开发过程中,很多时候组件都是拖拉出来,直接在故事版(storyboard)上直接使用,而并没有做输出关联,或者有些UILabel只做显示,不会进行修改.所以在这种不会在代码中修改的情况下,就需要用到故事版的国际化,如图 在xcode4.5之前,如果做故事版的国际化,是要维护多个storyboard,但在xcode4.5之后,国际化storyboard做国际化,就变成了一个storyboard,多个语言配置文件如图 其中Main.storyboard为真实的故事版文件,Main.stri

大话设计模式C++实现-第14章-观察者模式

一.UML图 关键词:Subject维护一个Observer列表.Subject运行Notify()时就运行列表中的每一个Observer的Update(). 二.概念 观察者模式:定义了一种一对多的依赖关系.让多个观察者对象同一时候监听某一主题对象. 这个主题对象在状态发生变化时,会通知全部观察者对象,使他们可以自己主动更新自己. 三.说明 角色: (1)Subject类:能够翻译为主题或者抽象通知者,一般用一个抽象类或者一个接口实现.他把全部对观察者对象的引用保存在一个聚集里,每一个主题都能

第一部分 基础篇 第三章 MongoDB体系结构

声明:该文章主要来自<MongoDB实战>一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录,在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用. MongoDB是一个可移植的数据库,它在流行的每一个平台上都可以使用,即所谓的跨平台性,在不同的操作系统上虽然略有差别,但是从整体架构上来看,MongoDB在不同的平台上是一样的,如数据逻辑结构和数据存储等等. 一个运行着的MongoDB数据库就可以看成是一个MongoDB

读书笔记_java设计模式深入研究 第五章 观察者模式 Observer

1,观察者模式适合解决多种对象跟踪一个对象数据变化的程序结构问题,一个称作"主题"的对象和若干个称作"观察者"的对象.在主题对象更新后会通知所有的观察者,使他们自动更新自己. 2,观察者UML类图: 3,角色解释: -1,抽象观察者(IObserver):为所有具体观察者定义接口,在得到主题通知的时候,更新观察者自身数据. -2,抽象主题(ISubject):使用数组引用维护一组观察者对象,可以增加和删除观察者,同时同志观察者自身的改变. -3,观察者(Observ

java设计模式学习笔记第三章

适配器(Adapter)模式 接口适配 适配器模式的意图在于,使用不同接口的类所提供的服务为客户端提供它所期望的接口. <interface>                                                     PhysicalRocket RocketSim                                                      PhysicalRocket( getMass():double              

读书笔记_java设计模式深入研究 第三章 工厂模式 Factory

1,简单工厂 -1,定制抽象接口. -2,定制具体子类. -3,定制工厂类,通过工厂类的静态方法返回不同的子类对象. package pattern.chp02.facroty; /**  *  类描述:汽车接口  *   *  @author:  Jing  *  @version  $Id: Exp$   *  *  History:  Dec 18, 2014 10:50:10 AM   Jing   Created.  *             */ public interface 

明解C语言 中级篇 第三章答案

练习3-1 /* 猜拳游戏(其四:分割函数/显示成绩)*/ #include <time.h> #include <stdio.h> #include <stdlib.h> int human; /* 玩家的手势 */ int comp; /* 计算机的手势 */ int win_no; /* 胜利次数 */ int lose_no; /* 失败次数 */ int draw_no; /* 平局次数 */ char* hd[] = { "石头", &q

第四部分 性能篇 第十一章 MongoDB 性能监控

声明:该文章主要来自<MongoDB实战>一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用. 1.MongoStat 此工具可以快速的查看某组运行中的MongoDB实例的统计信息,用法如下: [[email protected] bin]# ./mongostat connected to: 127.0.0.1 insert query update delete g

第二部分 应用篇 第七章 MongoDB MapReduce

1.简介 MongoDB的MapReduce相当于MySQL中的group by,所以在MongoDB上使用Map/Reduce进行统计很容易,使用MapReduce要实现两个函数Map函数和Reduce函数,Map函数调用emit(key,value),遍历collection中所有的记录,将key与value传递给Reduce函数进行处理,Map函数和Reduce函数可以使用JavaScript来实现,可以通过db.runCommand或者mapReduce命令来执行一个MapReduce的