IOS常用設計模式——觀察者模式(IOS開發)

來源:互聯網
上載者:User

IOS常用設計模式——觀察者模式(IOS開發)

觀察者模式(Observer)也叫發布/訂閱模式(Publish/Subscribe)

- 問題:

在軟體設計中,經常需要對一個對象的狀態改變,從而引起很多個物件的狀態發生改變。這個特點很明顯,複用性強,而且對象之間匿名通訊。觀察者模式最為適合。

- 原理:

舉個例子:

包括四個角色:

1、抽象主題(subject)。是個協議,是一個觀察者集合容器,定義了添加,移除和對所有觀察者發送通知(分別對應attach/detach/notifyObserver三個方法)。

2、抽象觀察者(Observer)。也是個協議,有一個更新方法(update)但是只是對自身進行Tlog。

3、具體觀察者(ConcreteObserver)。Observer協議的具體實現。

4、具體主題(ConcreteSubject)。Subject協議的具體實現。

兩個協議不僅提高了系統的可複用性,還降低了藕合度。

// Observer.h@protocol Observer@required-(void)update;@end// Subject.h@class Observer@protocol Subject@required-(void)attach:(Observer *) observer;-(void)detach:(Observer *) observer;-(void)notifyObservers;@end// ConcreteObserver.h#import "Observer.h"@interface ConcreteObserver : NSObject@end// ConcreteObserver.m#import "ConcreteObserver.h"@implementation ConcreteObserver-(void)update{    NSLog("%@", self);}@end// ConcreteSubject.h#import "Subject.h"@class Observer;@interface ConcreteSubject : NSObject{    NSMutableArray* observers;}@property (nonatomic, strong) NSMutableArray* observers;+(ConcreteSubject*)sharedConcreteSubject;@end// ConcreteSubject.m#import "ConcreteSubject.h"@implementation ConcreteSubject@synthesize observers;static ConcreteSubject *sharedConcreteSubject = nil;+(ConcreteSubject)sharedConcreteSubject{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        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

一、通知機制

整個流程可以這麼說:抽象主題(協議)負責聲明一些方法,然後交給具體主題去實現方法,然後對每一個觀察者進行操作。


-應用:

通知機制(notification):

這個應該通過執行個體來講,但是這樣真的複雜的一比。所以我盡量講明白這個過程。

通知時典型的一對多個物件的通訊。

這裡面有三個角色:

1、投送對象(協議):抽象主題

2、通知中樞(NSNotificationCenter):具體主題

3、接收者:觀察者

流程:

1、首先接受者們去註冊通知。(addObserver:selector:name:object:)

2、投送對象向訊息中心投送通知。(applicationWillTerminate:)

3、廣播中心對所有的接受者進行廣播。然後接受者通過(handleTerminate:)方法去接受notification

4、接受者可以解除訊息通知(removeObserver:)


二、KVO機制:再對象屬性變化時通知給觀察者,而不是對所有觀察者都發送通知

我還沒有遇到過!所以無法理解!下次再做修改!




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.