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

观察者(Obsserver)模式也叫发布/订阅(Publish/Subscribe)模式,是MVC(模式-视图-控制器)模式的重要组成部分。

在软件系统中,一个对象状态的改变可能会连带影响其他很多对象的状态发生改变。观察者模式能够很好的解决这类问题并且最大降低关系类之间的耦合度,给维护、复用和扩展带来很大的方便。

观察者模式有四个角色:

1、抽象主题(Subject)。抽象主题是一个协议,它是一个观察者集合容器,定义了添加观察者方法(attach)、移除观察者方法(detach)和为所有观察者发送通知的方法(notifyObserver)。

2、抽象观察者(Observer)。抽象观察者也是一个协议,它有一个更新方法(update)。

3、具体观察者(ConcreteObserver)。Observer协议的具体实现。

4、具体主题(ConcreteSubject)。Subject协议的具体实现。

下面是抽象主题和抽象观察者:

//
//  WBSubject.h
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/23.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//
//  抽象主题
//

#import <Foundation/Foundation.h>
#import "WBObserver.h"

@protocol WBSubject <NSObject>

@required

/**
 *  添加观察者
 *
 *  @param observer 实现了WBObserver协议的观察者
 */
- (void) attach:(id<WBObserver>)observer;

/**
 *  移除观察者
 *
 *  @param observer 实现了WBObserver协议的观察者
 */
- (void) detach:(id<WBObserver>)observer;

/**
 *  向观察者发送通知
 */
- (void) notifyObserver;

@end
//
//  WBObserver.h
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/23.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//
//  抽象观察者
//

#import <Foundation/Foundation.h>

@protocol WBObserver <NSObject>

@required

/**
 *  观察者的更新方法
 */
- (void) update;

@end

分别实现了抽象主题和抽象观察者的具体主题和具体观察者:

//
//  WBConcreteSubject.h
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/23.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//
//  具体主题
//

#import <Foundation/Foundation.h>
#import "WBSubject.h"

@interface WBConcreteSubject : NSObject <WBSubject>

@end

//
//  WBConcreteSubject.m
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/23.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//

#import "WBConcreteSubject.h"

@interface WBConcreteSubject()
@property (nonatomic, strong)NSMutableArray *observersArray;   //存放添加的观察者的数组
@end

@implementation WBConcreteSubject

- (id)init {
    self = [super init];

    _observersArray = [NSMutableArray array];

    return self;
}

- (void)attach:(id<WBObserver>)observer {
    [_observersArray addObject:observer];
}

- (void)detach:(id<WBObserver>)observer {
    if ([_observersArray count]>0) {
        [_observersArray removeObject:observer];
    }
}

- (void)notifyObserver {
    NSLog(@"开始发送通知>>>>");
    [_observersArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        [obj update];
    }];
}

@end
//
//  WBConcreteObserver.h
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/23.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//
//  具体观察者
//

#import <Foundation/Foundation.h>
#import "WBObserver.h"

@interface WBConcreteObserver : NSObject <WBObserver>

+ (id)createObserverWithName:(NSString *)name;

@end

//
//  WBConcreteObserver.m
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/23.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//

#import "WBConcreteObserver.h"

@interface WBConcreteObserver () {
    NSString *_myName;
}
@end

@implementation WBConcreteObserver

+ (id)createObserverWithName:(NSString *)name {
    WBConcreteObserver *observer = [[WBConcreteObserver alloc] initWithMyName:name];
    return observer;
}

- (id)initWithMyName:(NSString *)name {
    self = [super init];

    _myName = name;

    return self;
}

- (void)update {
    NSLog(@"%@:update...", _myName);
}

@end

下面是调试代码:

WBConcreteSubject *subject = [[WBConcreteSubject alloc] init];

    WBConcreteObserver *observer0 = [WBConcreteObserver createObserverWithName:@"observer0"];
    WBConcreteObserver *observer1 = [WBConcreteObserver createObserverWithName:@"observer1"];
    WBConcreteObserver *observer2 = [WBConcreteObserver createObserverWithName:@"observer2"];

    [subject attach:observer0];
    [subject attach:observer1];
    [subject attach:observer2];

    [subject notifyObserver];   //发送通知

    [subject detach:observer1];  //将observer1观察者移除

    [subject notifyObserver];   //再次发送通知

输出结果:

2015-06-23 21:05:02.179 DesignPatternsDemo[27387:607] 开始发送通知>>>>
2015-06-23 21:05:02.180 DesignPatternsDemo[27387:607] observer0:update...
2015-06-23 21:05:02.180 DesignPatternsDemo[27387:607] observer1:update...
2015-06-23 21:05:02.181 DesignPatternsDemo[27387:607] observer2:update...
2015-06-23 21:05:02.181 DesignPatternsDemo[27387:607] 开始发送通知>>>>
2015-06-23 21:05:02.182 DesignPatternsDemo[27387:607] observer0:update...
2015-06-23 21:05:02.182 DesignPatternsDemo[27387:607] observer2:update...

最后附上代码文件:观察者模式

时间: 2024-08-02 12:34:59

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

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

常用设计模式之观察者模式 + 事件委托

常用设计模式之观察者模式 + 事件委托 作用及UML (摘自<大话设计模式>) Code 1 abstract class Subject{ 2 protected String state; 3 public void setState(String state){this.state = state;} 4 public String getState(){return this.state;} 5 6 private List<Observer> observers = ne

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开发)

观察者模式(Observer)也叫发布/订阅模式(Publish/Subscribe) - 问题: 在软件设计中,经常需要对一个对象的状态改变,从而引起很多对象的状态发生改变.这个特点很明显,复用性强,而且对象之间匿名通信.观察者模式最为适合. - 原理: 举个例子: 包括四个角色: 1.抽象主题(subject).是个协议,是一个观察者集合容器,定义了添加,移除和对所有观察者发送通知(分别对应attach/detach/notifyObserver三个方法). 2.抽象观察者(Observer

iOS常用设计模式——适配器Adapter

1.什么是适配器设计模式(Adapter)   (What) 适配器设计模式是一种结构型设计模式, 它的作用是把一个类的接口转换成客户希望的另外一个接口,从而使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器设计模式有两种实现方式:1.)通过继承来实现两个接口,叫类适配器: 2.)通过引用来避免对象适配器继承被适配对象,叫对象适配器. 图1: 类适配器的UML图 在类适配器中,Adapter与Adaptee之间的关系是继承,我们通过继承来实现对Adaptee中+ specific

iOS开发指南 第8章 iOS常用设计模式 学习

设计模式是在特定场景下对特定问题的解决方案 1 单例模式 作用:解决“应用中只有一个实例”的问题,这个实例的作用是全局的,比如说是可以实现一些共享资源 方法的访问和状态的保持 实现原理:一般会封装一个静态属性,并提供静态实例的创建方法. *********** James Rumbaugh对类的定义是:类是具有相似结构.行为和关系的一组对象的描述符.类是面向对象系统中最重要的构造块.类图显示了一组类.接口.协作以及他们之间的关系. 建立类图的步骤: (1)研究分析问题领域确定系统需求. (2)确

读书笔记-常用设计模式之观察者模式

1.观察者(Observer)模式也叫发布/订阅(Publish/Subscribe)模式,是MVC(模型-视图-控制器)模式的重要组成部分.在软件系统中,一个对象状态改变也会连带影响其他很多对象的状态发生改变.能够实现这一需求且复用性强,对象之间匿名通信的,观察者模式是其中最适合的一个. 2.观察者模式的类图如下: 它有四个角色: 抽象主题(Subject):在Objective-C中,抽象主题是一个协议,它是观察者集合容器,定义了添加观察者(attach)方法.移除观察者(detach)方法

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

单例模式是iOS设计模式中常用的一种设计模式,它的意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点.单例模式的作用就是为了解决“应用中只有一个实例”这一类问题. 单例模式一般会封装一个静态属性,并提供静态实例的创建方法.下面上代码: // // Singleton.h // DesignPatternsDemo // // Created by 韩学鹏 on 15/6/19. // Copyright (c) 2015年 韩学鹏. All rights reserved. // #im