定义:
观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式),一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
示例代码:自己实现观察者模式
创建Protocol类型的接口文件SubProtocol协议类
SubProtocol.h
#import <Foundation/Foundation.h>
@protocol SubProtocol <NSObject>
//用户的信息和从某一个刊物接收的信息
- (void)subMessage:(id)message withSubNumber:(NSString *)withSubNumber;
@end
创建观察中心SubCenter类
SubCenter.h
#import <Foundation/Foundation.h>
#import "SubProtocol.h"
@interface SubCenter : NSObject
// 创建书刊订阅号
+ (void)creatNumber:(NSString *)subNumber;
// 移除订阅号
+ (void)removeNumber:(NSString *)subNumber;
// 添加用户
+ (void)addUser:(id <SubProtocol>)user wihtNumber:(NSString *)userNumber;
// 移除用户
+ (void)removeUser:(id <SubProtocol>)user withNumber:(NSString *)userNumber;
// 发送消息
+ (void)sendMessage:(id)message withSubNumber:(NSString *)SubNumber;
@end
SubCenter.m
//
// SubCenter.m
// 观察者模式
//
// Created by James on 2017/12/9.
// Copyright © 2017年 TZ. All rights reserved.
#import "SubCenter.h"
static NSMutableDictionary *bookCenter = nil;
@implementation SubCenter
//单例
+ (void)initialize {
if (self == [SubCenter class]) {
bookCenter = [NSMutableDictionary dictionary];
}
}
// 创建书刊订阅号
+ (void)creatNumber:(NSString *)subNumber {
// NSHashTable 就是一个集合,但是它是弱引用的.
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 <SubProtocol>)user wihtNumber:(NSString *)userNumber {
NSHashTable *hashTable = [self existNumber:userNumber];
[hashTable addObject:user];
}
// 移除用户
+ (void)removeUser:(id <SubProtocol>)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 <SubProtocol> object = nil;
while (object = [enumerato nextObject]) {
if ([object respondsToSelector:@selector(subMessage:withSubNumber:)]) {
[object subMessage:message withSubNumber:SubNumber];
}
}
}
}
#pragma mark - 私有方法
// 实现了代理方法
+ (NSHashTable *)existNumber:(NSString *)subStringNumber {
return [bookCenter objectForKey:subStringNumber];
}
@end
ViewController调用
#import "ViewController.h"
#import "SubCenter.h"
static NSString *SCIENCE = @"SCIENCE";
@interface ViewController () <SubProtocol>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 创建订阅
[SubCenter creatNumber:SCIENCE];
// 添加订阅
[SubCenter addUser:self wihtNumber:SCIENCE];
// 发送消息
[SubCenter sendMessage:@"11" withSubNumber:SCIENCE];
}
- (void)subMessage:(id)message withSubNumber:(NSString *)withSubNumber {
NSLog(@"----%@----%@",message, withSubNumber);
}
@end