首页 > 学院 > 开发设计 > 正文

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

2019-11-14 18:16:03
字体:
来源:转载
供稿:网友

1、观察者(Observer)模式也叫发布/订阅(Publish/Subscribe)模式,是MVC(模型-视图-控制器)模式的重要组成部分。在软件系统中,一个对象状态改变也会连带影响其他很多对象的状态发生改变。能够实现这一需求且复用性强,对象之间匿名通信的,观察者模式是其中最适合的一个。

2、观察者模式的类图如下:

 它有四个角色:

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

抽象观察者(Observer):在OC中,抽象观察者是一个协议,它是一个更新(update)方法。

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

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

引入Subject和Observer这两个协议后,不仅提高了系统的可复用性,还降低了耦合度。

抽象观察者(Observer)和抽象主题(Subject)的实现代码如下:

 1 // 2 //Observer.h  3 //ObserverPattern  4 // 5 @PRotocol Observer  6 @required 
-(void)update; 7 @end 8 9 //10 //Subject.h11 //ObserverPattern12 //13 @class Observer;14 @protocol Subject15 @required16 -(void)attach:(Observer*) observer; 17 -(void)detach:(Observer*) observer; 18 -(void)notifyObservers;19 @end

具体观察者(ConcreteObserver)的实现代码如下:

////ConcreteObserver.h//ObserverPattern//#import "Observer.h"@interface ConcreteObserver : NSObject <Observer> @end////ConcreteObserver.m//ObserverPattern//#import "ConcreteObserver.h"@implementation ConcreteObserver//只是做了个输出处理-(void)update{        NSLog(@"ConcreteObserver : %@",self); }@end

下面是具体主题(ConcreteSubject)的实现代码:

////ConcreteSubject.h//ObserverPattern//#import "Subject.h"@class Observer;@interface ConcreteSubject : NSObject <Subject>{        NSMutableArray* observers;}@property (nonatomic ,strong) NSMutableArray* observers;+(ConcreteSubject*)sharedConcreteSubject;@end////ConcreteSubject.m //ObserverPattern//#import "ConcreteSubject.h" @implementation ConcreteSubject@synthesize observers;static ConcreteSubject *sharedConcreteSubject = nil;+(ConcreteSubject*)sharedConcreteSubject{        static dispatch_once_t once;        dispatch_once(&once, ^{            sharedConcreteSubject = [[self alloc] init];            sharedConcreteSubject.observers = [[NSMutableArray alloc] init]; });        return sharedConcreteSubject;}-(void)attach:(Observer*) observer{        [self.observers addObject:observer];}-(void)detach:(Observer*) observer{        [self.observers removeObject:observer];}-(void)notifyObservers{        for (id obs in self.observers)        {           [obs update];        }} @end

因为ConcreteSubject只需要一个实例,所以我们采用单例设计模式实现。

3、通知机制和KVPO机制

在Cocoa Touch框架中,观察者模式的具体应用有两个-通知(notification)机制和KVO(Key-Value-Observing)机制。

3.1、通知机制

通知机制和委托机制不同的是,前者是“一对多”的对象之间的通信,后者是“一对一”的对象之间的通信。

如图,在通知机制中对某个通知感兴趣的所有对象都可以成为接收者。首先,这些对象需要向通知中心(NSNotificationCenter)发出addObserver:selector:name:object:消息进行注册,在投送对象投送通知给通知中心时,通知中心就会把通知广播给注册过的接收者。所有的接收者都不知道通知是谁投送的,更不关系它的细节。投送对象与接收者是一对多的关系。接收者如果对通知不再关注,会给通知中心发出removeObserver:name:object:消息接触注册,以后不再接收通知。

代码示例:主界面控制器MainViewController和翻转界面控制器FilpsideViewController,此外还有应用程序委托对象AppDelegate。我们将两个视图控制器座位通知的接收者,应用程序委托对象作为通知投送对象。

在MainViewController和FilpsideViewController这两个视图控制器中,注册通知接收者的代码如下:

1 - (void)viewDidLoad2 {3     [super viewDidLoad];4     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleTerminate:) name:@"AppWillTerminateNotification" object:nil];5 }

解除注册代码类似,通过NSNotificationCenter发出removeObserver消息实现。对于一般的OC对象可以在dealloc方法中发出消息。对于视图控制器,也可以在didReceiveMemoryWarning方法或viewDidUnload方法中发出消息。

1 - (void)dealloc2 {3 [[NSNotificationCenter defaultCenter] removeObserver:self];4 }

MainViewController和FilpsideViewController处理通知的方法基本相同

1 #pragma mark - 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表