[设计模式]06.观察者模式

作者: 沈枫_ShenF | 来源:发表于2019-11-15 11:58 被阅读0次

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。

观察者模式UML

从UML图可以看到,观察者模式有两大类:主题和观察者,有以下四个角色:
(1)Subject:抽象主题,他把所有观察者对象保存在一个集合里,可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
(2)ConcreteSubject:具体主题,该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知
(3)Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
(4)ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。

举例说明

案例:订阅书刊。

1.定义接口

@protocol SubjectProtocol <NSObject>
- (NSString*)test;
- (void)subMessage:(id)message withSubNumber:(NSString *)withSubNumber;
@end

2.主题

@interface SubjectCenter : NSObject
// 创建书刊订阅号
+ (void)creatNumber:(NSString *)subNumber;

// 移除订阅号
+ (void)removeNumber:(NSString *)subNumber;

// 添加用户
+ (void)addUser:(id <SubjectProtocol>)user wihtNumber:(NSString *)userNumber;

// 移除用户
+ (void)removeUser:(id <SubjectProtocol>)user withNumber:(NSString *)userNumber;

// 发送消息
+ (void)sendMessage:(id)message withSubNumber:(NSString *)SubNumber;

实现中,使用NSHashTable来保存使用者,NSHashTable 就是一个集合,但是它是弱引用的。

#import "SubjectCenter.h"
static NSMutableDictionary *bookCenter = nil;
@implementation SubjectCenter

+ (void)initialize {
    if (self == [SubjectCenter class]) {
        bookCenter = [NSMutableDictionary dictionary];
    }
}

// 创建书刊订阅号
+ (void)creatNumber:(NSString *)subNumber {
    NSHashTable *hashTable = [self existNumber:subNumber];
    if (hashTable == nil) {
        hashTable = [NSHashTable weakObjectsHashTable];
        [bookCenter setObject:hashTable forKey:subNumber];
    }
}

// 移除订阅号
+ (void)removeNumber:(NSString *)subNumber {
    NSHashTable *hashTable = [self existNumber:subNumber];
    if (hashTable) {
        [bookCenter removeObjectForKey:subNumber];
    }
}

// 添加用户
+ (void)addUser:(id <SubjectProtocol>)user wihtNumber:(NSString *)userNumber {
    NSHashTable *hashTable = [self existNumber:userNumber];
    [hashTable addObject:user];
}

// 移除用户
+ (void)removeUser:(id <SubjectProtocol>)user withNumber:(NSString *)userNumber {
    NSHashTable *hashTable = [self existNumber:userNumber];
    [hashTable removeObject:user];
}

// 发送消息
+ (void)sendMessage:(id)message withSubNumber:(NSString *)SubNumber {
    NSHashTable *hashTable = [self existNumber:SubNumber];
    if (hashTable) {
        NSEnumerator *enumerato = [hashTable objectEnumerator];
        id <SubjectProtocol> object = nil;
        while (object = [enumerato nextObject]) {
            if ([object respondsToSelector:@selector(subMessage:withSubNumber:)]) {
                [object subMessage:message withSubNumber:SubNumber];
            }
        }
    }
}

// 实现了代理方法
+ (NSHashTable *)existNumber:(NSString *)subStringNumber {
    return [bookCenter objectForKey:subStringNumber];
}
@end

3.观察者观察

@interface ViewController () <SubjectProtocol>
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // 创建订阅
    [SubjectCenter creatNumber:@"string"];
    // 添加订阅
    [SubjectCenter addUser:self wihtNumber:@"string"];
    // 发送消息
    [SubjectCenter sendMessage:@"11" withSubNumber:@"string"];
}

- (void)subMessage:(id)message withSubNumber:(NSString *)withSubNumber {
    NSLog(@"----%@----%@",message, withSubNumber);
}
@end

load和initialize方法详见这篇文章

KVO就是一种观察者模式的设计

KVO的底层实现原理请看这篇文章

相关文章

  • 观察者设计模式

    每周学点Java设计模式__观察者设计模式 本次继续更新java23中设计模式之一——观察者模式。 观察者模式(有...

  • [设计模式]06.观察者模式

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

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

    [toc] 设计模式02-观察者者设计模式 主要来源Head First设计模式(书)观察者设计模式是JDK中使用...

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava设计模式与原理

    标准观察者设计模式 RxJava是一种特殊的观察者模式,首先我们先来看标准的观察者设计模式。在标准观察者模式中,存...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • Guava源码分析——EventBus

    EventBus的设计理念是基于观察者模式的,可以参考设计模式(1)—观察者模式先来了解该设计模式。 1、程序示例...

  • 设计模式之观察者模式

    设计模式之观察者模式 本篇是设计模式系列博客的第四篇,本篇主要学习设计模式中的第二个行为型模式---观察者模式。 ...

  • PHP设计模式之观察者模式

    PHP设计模式之观察者模式

网友评论

    本文标题:[设计模式]06.观察者模式

    本文链接:https://www.haomeiwen.com/subject/nferpctx.html