观察者模式OC版

观察者模式定义? 
 

                  当一个对象状态发生改变,所有依赖于他订阅者都会发生改变(收到状态改变的通知)。

 2、观察者模式-应用场景?

                  场景一:关联场景

                  场景二:事件多级触发

                  场景三:跨系统消息交互场景

 3、观察者模式-角色划分?

                  四个角色?

                  角色一:被观察者(目标对象->抽象)

                  角色二:具体被观察者(目标对象)

                  角色三:观察者

                  角色四:具体观察者

 代码示例:

抽象被观察者:

#import "Observable.h"

@interface Observable()

@property (nonatomic,strong)NSMutableArray *obsArray;

@end

@implementation Observable

- (instancetype)init

{

    self = [superinit];

    if (self) {

        _obsArray =[[NSMutableArrayalloc]init];

    }

    return self;

}

//注册观察者

- (void)addObserver:(id<Observer>)o{

    

    [_obsArray addObject:o];

}

//取消观察者

- (void)cancelObserver:(id<Observer>)o{

    

    [_obsArrayremoveObject:o];

}

//取消所有观察者

- (void)cancelAllObservers{

    

    [_obsArrayremoveAllObjects];

}

//获得所有观察者

- (NSInteger)countObservers{

    

    return_obsArray.count;

}

//发送通知

-(void)notifyObservers{

    

    [selfnotifyObservers:nil];

}

-(void)notifyObservers:(NSObject*)msg{

    

    for (id<Observer>oin_obsArray) {

        [o update:selfmsg:msg];

    }

}

@end

抽象观察者协议:

#import <Foundation/Foundation.h>

@class Observable;

//观察者->抽象

@protocol Observer <NSObject>

-(void)update:(Observable*)o msg:(NSObject*)msg;

@end

具体观察者1:

.h

#import <Foundation/Foundation.h>

#import "Observer.h"

@interface specificObserver1 : NSObject<Observer>

@end

.m

#import "specificObserver1.h"

@implementation specificObserver1

- (void)update:(Observable *)o msg:(NSObject *)msg{

    

    NSLog(@"具体观察者1收到--%@",msg);

    

}

@end

具体观察者2:

.h

#import <Foundation/Foundation.h>

#import "Observer.h"

@interface specificObserver2 : NSObject<Observer>

@end

.m

#import "specificObserver2.h"

@implementation specificObserver2

- (void)update:(Observable *)o msg:(NSObject *)msg{

    

    NSLog(@"具体观察者2收到--%@",msg);

    

}

@end

测试调用类:

- (void)demo1{//抽象的被观察者测试

    

    Observable  *obs = [[Observable alloc]init];

    id<Observer>specific1 = [[specificObserver1 alloc]init];

    id<Observer>specific2 = [[specificObserver2 alloc]init];

    [obs addObserver:specific1];

    [obs addObserver:specific2];

    [obs notifyObservers:@"测试发送消息"];

}

代码demo

 
 
 
 

 
 

 
 

猜你喜欢

转载自blog.csdn.net/tiantianios/article/details/78147651