iOS常用设计模式——观察者设计模式

观察者设计模式详解

  • 观察者设计模式详解

    • 基本概念
    • NSNotificationCenter的使用
      • 添加监听
      • 接收消息
      • 删除监视
    • KVO的使用
      • 基本概念
      • 注册观察者
      • 观察者对象发生变化时的回调方法
      • remove观察者身份
      • 代码实现

基本概念

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.而在IOS开发中我们可能会接触到的经典观察者模式的实现方式,有这么几种:NSNotificationCenter、KVO、Delegate等

NSNotificationCenter的使用

添加监听

  • (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

    sample:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) name:GET_UP object:nil];

    说明:

    【NSNotificationCenter defaultCenter】消息中心只有一个,通过该方法获取该类的单例

    addObserver:添加监听者

    selector:表示监听到到对象后的处理函数

    name:表示注册所关心的消息名称

接收消息

  • (void)postNotification:(NSNotification *)notification;
  • (void)postNotificationName:(NSString *)aName object:(id)anObject;
  • (void)postNotificationName:(NSString )aName object:(id)anObject userInfo:(NSDictionary )aUserInfo;

    sample:

    [[NSNotificationCenter defaultCenter] postNotificationName:GET_UP object:[NSNumber numberWithInteger:self.time]];

    分析:

    GET_UP:推送消息的名称

    object:发送消息的对象

    userInfo:发送消息携带的信息

删除监视

  • (void)removeObserver:(id)observer;
  • (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;

KVO的使用

基本概念

KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。该方法与NSNotification有很大的不同,它并不需要一个NotificationCenter来为所有观察者提供变化通知,相反的是,当有变化发生时,该通知直接发送给观察者,NSObject为我们实现了此方法。

利用此方法我们可以观察对象,是一种一对多的关系。

注册观察者

首先必须发送一个

addObserver:selfforKeyPath:@”happyNum” options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld

context:nil]消息至观察对象,用以传送观察对象和需要观察的属性的关键路径,参数分析:

- (void)addObserver:(NSObject )observer forKeyPath:(NSString )keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;

observer:表示观察者是谁,一般为self

keyPath: 表示观察哪个对象

options:NSKeyValueObservingOptionNew表示观察新值,NSKeyValueObservingOptionOld表示观察旧值

context:表示上下文环境

观察者对象发生变化时的回调方法

  • (void)observeValueForKeyPath:(NSString *)keyPath

    ofObject:(id)object

    change:(NSDictionary *)change

    context:(void *)context {

    NSLog(@”%@”,change);

    }

    参数分析:

    change:表示发生改变时返回的值

    keyPath:表示观察对象

    contenst:表示上下文

remove观察者身份

发送一条制定观察方对象和路径来移除观察者,该函数一般放在dealloc:

[self.childremoveObserver:selfforKeyPath:@”happyNum”context:nil];

代码实现

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

@interface Child : NSObject

@property(nonatomic,assign)NSInteger happyNum;
@end

child.m
#import "Child.h"

@implementation Child
-(id)init
{
    self=[super init];
    if(self)
    {
        self.happyNum=100;
        [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(decrease:) userInfo:nil repeats:YES];

    }
    return  self;
}
-(void)decrease:(NSTimer*)timer
{
  // NSLog(@"the happyNum is %ld",self.happyNum);
    _happyNum--;
   // [self setValue:[NSNumber numberWithInteger:_happyNum] forKey:@"happyNum"];
}

@end

nurse.h
#import <Foundation/Foundation.h>
#import "Child.h"

@interface Nurse : NSObject
@property(nonatomic,retain)Child *child;
-(id)initWithChild:(Child*)child;
@end
nurse.m:
#import "Nurse.h"

@implementation Nurse
-(id)initWithChild:(Child*)child
{
    self=[super init];
    if(self)
    {
        self.child = child;

        [self.child addObserver:self forKeyPath:@"happyNum"
                    options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
                    context:nil];
    }
    return  self;
}
- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {

    NSLog(@"%@",change);
}
-(void)dealloc
{
    [self.child removeObserver:self forKeyPath:@"happyNum" context:nil];
    [_child release];
    [super dealloc];
}
@end

main.m:
#import <Foundation/Foundation.h>
#import "Child.h"
#import "Nurse.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Child *childObj=[[[Child alloc] init] autorelease];
        Nurse *nurseObj=[[[Nurse alloc] initWithChild:childObj] autorelease];
        [[NSRunLoop currentRunLoop] run];
        //[nurseObj release];
    }
    return 0;
}
时间: 2024-07-28 23:35:04

iOS常用设计模式——观察者设计模式的相关文章

JAVA设计模式——观察者设计模式和Reactor反应堆设计模式

被观察者(主题)接口 定义主题对象接口 /**抽象主题角色: 这个主题对象在状态上发生变化时,会通知所有观察者对象 也叫事件对象 */ public interface Subject { //增加一个观察者 public void addWatcher(Watcher watcher); //删除一个观察者 public void removeWatcher(Watcher watcher); //通知所有的观察者 public void notifyWatchers(String str);

Java常用类库--观察者设计模式( Observable类Observer接口)

原文链接:http://www.2cto.com/kf/201310/253013.html 如果要想实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 import java.util.* ; 

设计模式--观察者设计模式

定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新. Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步. java提供Obeservable类和Observer接口. 比如购房,购房者是观察者,而房价是被观察者,房价的变化是被观察者所关注的. /** * 被观察者 * @author soyoungboy * */ public class House extends Observable {

iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)

关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. 首先得搞清楚设计模式是个什么鬼,在软件设计领域,设计模式是对通用问题的可复用的解决方案.设计模式是一系列帮你写出更可理解和复用代码的模板,设计模式帮你创建松耦合的代码以便你不需要费多大力就可以改变或者替换代码中的组件 其实iOS中的设计模式有非常多,常用的就下面这四种 一.MVC设计模式(设计模式

iOS.常用设计模式.02.委托模式

WTDelegate #import <Foundation/Foundation.h> @protocol WTDelegate <NSObject> @required - (void)sleep; - (void)eat; - (void)work; @end WTPhilosopher.h #import <Foundation/Foundation.h> #import "WTDelegate.h" @interface WTPhiloso

iOS.常用设计模式.01.单例模式

使用单例模式的类: UIApplication UIAccelerometer NSUserDefaults NSNotificationCenter NSFileManager NSBundle等 Singleton.h #import <Foundation/Foundation.h> @interface Singleton : NSObject // 始终返回同一个Singleton的指针 + (Singleton *)sharedManager; @property (strong,

IOS常用设计模式——单例模式(IOS开发)

IOS常用的设计模式包括:单例模式.委托模式.观察者模式和MVC模式. 这里主要讲单例模式 单例模式 -问题: 主要解决应用中只有一个实例的问题(只需要某个类的实例) -原理:一般会封装一个静态属性,并提供静态实例的创建方法 -应用:单例类 // Singleton.h @interface Singleton : NSObject + (Singleton *)sharedManager; @property (nonatomic, strong) NSString* stingletonDa

iOS常用设计模式——单例设计模式

单例设计模式详解 单例设计模式详解 基本概念 在IOS中使用单例模式的情况 非ARC环境创建单例模式的基本步骤 非ARC环境具体代码实现 ARC环境创建单例模式的基本步骤 基本概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问 在IOS中使用单例模式的情况 1.如果说创建一个对象会耗费很多系统资源,那么此时采用单例模式,因为只需要一个实例,会节省alloc的时间 2.在IOS开发中,如果很多模

iOS常用设计模式——单例模式

第一部分: 创建一个单例对象 单例的应用场景: 单例模式用于当一个类只能有一个实例的时候, 通常情况下这个"单例"代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据.用单例模式加以控制是非常有必要的. 什么是单例模式? 单例是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为. 单例设计模式需要达到下面几个目的:1.