你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> IOS常用設計模式——觀察者模式(IOS開發)

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

編輯:IOS開發綜合

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

- 問題:

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

- 原理:

舉個例子:

包括四個角色:

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

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

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機制:再對象屬性變化時通知給觀察者,而不是對所有觀察者都發送通知

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




  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved