亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS應用開發中使用設計模式中的觀察者模式的實例

2020-07-26 03:25:43
字體:
來源:轉載
供稿:網友

在軟件開發中,無論是那種高級語言中總會伴隨著一些最為常用的設計模式,即便就如iOS開發中與我們打交道最多的無非就是單例模式、觀察者模式和工廠模式了,當然了其他的設置模式也同樣存在在編程的很多地方。下面就就讓我們簡單的了解下觀察者模式吧!
觀察者模式本質上時一種發布-訂閱模型,用以消除具有不同行為的對象之間的耦合,通過這一模式,不同對象可以協同工作,同時它們也可以被復用于其他地方Observer從Subject訂閱通知,ConcreteObserver實現重現ObServer并將其重載其update方法。一旦SubJect的實例需要通知Observer任何新的變更,Subject會發送update消息來通知存儲在其內部類中所注冊的Observer、在ConcreteObserver的update方法的實際實現中,Subject的內部狀態可被取得并進行后續處理。其類圖如下:

201631795044843.jpg (737×317)


由上面我們可以發現觀察者模式無非在是定義對象間的一種一對多的依賴關系,并且當一個對象的狀態發生改變的時候,所有依賴于它的對象都會得到通知且自動更新。即如果Subject允許其他觀察者(實現了觀察者接口的對象)對這個Subject的改變進行請閱,當Subject發送了變化,那么Subject會將這個變化發送給所有的觀察者,觀察者就能對Subject的變化做出更新。其時序圖如下

201631795111827.png (466×255)

通過上面的觀察我們可以發現如果用N個Observer來拓展Subject的行為,這些Observer具有處理存儲在Subject中的信息的特定實現,這樣也就實現了前面所說的消除不同對象間的耦合的功能了。
那么了解了這些我們可能就會更像了解下我們在什么時候才會去使用觀察者模式呢?
當需要將改變通知所有的對象時,而你又不知道這些對象的具體類型
改變發生在同一個對象中,并需要改變其他對象將相關的狀態進行更新且不知道有多少個對象。
而同樣的在我們日常的開發中在Cocoa Touch框架中的的兩種經常打交道的技術KVO與通知都實現了觀察者模式,所以下面我們討論的重點也就是基于這兩個方面的。
通知
言歸正傳,在Cocoa Touch框架中NSNotificationCenter和NSNotification對象實現了一對多的模型。通過NSNotificationCenter可以讓對象之間進行通訊,即便這些對象之間并不認識。下面我們來看下NSNotificationCenter發布消息的方法:

復制代碼 代碼如下:

   NSNotification  * subjectMessage = [ NSNotification  notificationWithName:@"subjectMessage"  object: self];
    NSNotificationCenter  * notificationCenter = [ NSNotificationCenter  defaultCenter];
    [notificationCenter postNotification:subjectMessage];

通過上面的代碼我們創建了一個名為subjectMessage的NSNotification對象,然后通過notificationCenter來發布這個消息。通過向NSNotificationCenter類發送defaulCenter消息,可以得到NSNotificationCenter實例的引用。每個進程中只有一個默認的通知中心,所以默認的NSNotificationCenter是個單例對象。如果有其他觀察者定于了其對象的相關事件則可以通過以下的方法來進行操作:
復制代碼 代碼如下:

    NSNotificationCenter  * notificationCenter1 = [ NSNotificationCenter  defaultCenter];
    [notificationCenter addObserver: self  selector: @selector(update:) name:@"subjectMessage"  object: nil ];

經過以上步驟我們已經向通知中心注冊了一個事件并且通過selector制定了一個方法update:下面我們可以實現以下這個方法
復制代碼 代碼如下:

- (void)update:(NSNotification*)notification{

        if ([[notification name] isEqualToString:@"subjectMessage"]) {
            NSLog(@"%@",@"猴子派來的救兵去哪了?");

        }
}


當然最后如果我們需要對監聽進行銷毀
復制代碼 代碼如下:

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

實例
抽象主題協議:

復制代碼 代碼如下:

#import <Foundation/Foundation.h> 
@class Observer; 
 
/*!
 *  抽象主題協議
 *
 *  @since V1.0
 */ 
@protocol Subject <NSObject> 
 
@required 
 
/*!
 *  增加觀察者
 *
 *  @param observer 觀察者實例
 *
 *  @since V1.0
 */ 
-(void)attach:(Observer*) observer; 
/*!
 *  移除觀察者
 *
 *  @param observer 觀察者實例
 *
 *  @since V1.0
 */ 
-(void)detach:(Observer*) observer; 
/*!
 *  為觀察者發送通知
 *
 *  @since V1.0
 */ 
-(void)notifyObservers; 
 
@end 

觀察者協議:
復制代碼 代碼如下:

#import <Foundation/Foundation.h> 
 
/*!
 *  觀察者協議
 *
 *  @since V1.0
 */ 
@protocol Observer <NSObject> 
 
@required 
-(void)update; 
 
@end 

具體的觀察者類:
復制代碼 代碼如下:

#import <Foundation/Foundation.h> 
#import "Observer.h" 
 
/*!
 *  具體的觀察者類
 *
 *  @since V1.0
 */ 
 
@interface ConcreteObserver : NSObject<Observer> 
 
@end 

具體主題類:
復制代碼 代碼如下:

#import <Foundation/Foundation.h> 
#import "Subject.h" 
 
/*!
 *  具體主題類
 *
 *  @since V1.0
 */ 
@interface ConcreteSubject : NSObject<Subject> 

    NSMutableArray *observers; 

@property(nonatomic,strong)NSMutableArray* observers; 
/*!
 *  單例構建自身對象
 *
 *  @return 自身對象
 *
 *  @since V1.0
 */ 
+(ConcreteSubject*)shareConcreteSubject; 
 
@end 

了解過通知之后我們來看一下KVO
KVO是Cocoa提供的一種稱為鍵值觀察的機制,對象可以通過它得到其他對象特定屬性的變更通知。而這個機制是基于NSKeyValueObserving非正式些,Cocoa通過這個協議為所有遵循協議的對象提供了一種自動化的屬性監聽的功能。
雖然通知和KVO都可以對觀察者進行實現,但是他們之間還是略有不同的,由上面的例子我們可以看出通知是由一個中心對象為所有觀察者提供變更通知,主要是廣義上關注程序事件,而KVO則是被觀察的對象直接想觀察者發送通知,主要是綁定于特定對象屬性的值。下面我們通過一個簡單的例子來了解下他的一些是使用方法
首先我們有Hero這個模型

復制代碼 代碼如下:

@property (nonatomic,copy) NSString * name;@property (nonatomic,copy) NSString * title;@property (nonatomic,assign) NSUInteger age;

在控制其中我們將其初始化并賦值
復制代碼 代碼如下:

    self.hero = [[Hero alloc] init];
    self.hero.name = @"趙云";
    self.hero.title = @"將軍";
    self.hero.age = 87;

現在我們的這個對象基本有值了,那么我們將這個對象的name監聽下他的改變
復制代碼 代碼如下:

[self.hero addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

觸發通知并將值改變
復制代碼 代碼如下:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    self.hero.name = @"張飛";
}

在制定的回調函數中,處理收到的更改通知
復制代碼 代碼如下:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if([keyPath isEqualToString:@"name"])
    {
        NSLog(@"賦值后--%@",self.hero.name);
        NSLog(@"新的值--%@",change[@"new"]);
        NSLog(@"以前的值--%@",change[@"old"]);

    }
}


回調打印如下:

201631795149534.png (211×54)


最后注銷觀察者

復制代碼 代碼如下:

- (void)dealloc{
    [self.hero removeObserver:self forKeyPath:@"name"];
}


到了這里觀察者模式中常用的KVO及通知的內容就到這里,不過要知道這里談及的只是最基礎的用法,后面我們可能還是有更加深入的探究,或者在后續中可能還會對比iOS中的代理以及Block來探尋下iOS中的消息傳遞機制,再或者像Swift中的didSet、willSet的屬性監聽的方法,這些都是很好玩的內容,不是么?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品成人动漫| 一区二区在线视频| 亚洲免费视频一区二区| 国产视频精品va久久久久久| 日韩av网址在线| 日韩中文字幕第一页| 亚洲欧美国产精品| 久久综合色88| 激情成人在线视频| 第一福利永久视频精品| 欧美亚洲另类视频| 日韩av不卡在线| 亚洲性生活视频在线观看| 亚洲精品videossex少妇| 欧美大片免费观看在线观看网站推荐| 97久久超碰福利国产精品…| 国产成人精品av在线| 亚洲白拍色综合图区| 国产精品国语对白| 8090理伦午夜在线电影| 亚洲人成网在线播放| 久久亚洲精品小早川怜子66| 国产精品久久久久久av福利| 麻豆乱码国产一区二区三区| 国产日韩欧美自拍| 日韩免费在线播放| 色爱精品视频一区| 国内精品久久久久伊人av| 国产日韩av高清| 91在线看www| 国产精品入口日韩视频大尺度| 亚洲精品二三区| 日韩精品视频在线观看网址| 久久久精品亚洲| 日韩国产激情在线| 成人妇女淫片aaaa视频| 亚洲第一视频网| 色婷婷av一区二区三区久久| 精品日韩中文字幕| 国产精品日韩欧美大师| 国产一区欧美二区三区| 97成人在线视频| 不卡av日日日| 91精品国产色综合久久不卡98口| 日韩精品免费在线视频观看| 高跟丝袜一区二区三区| 日韩乱码在线视频| 国产91精品网站| 九九精品在线视频| 欧美一区深夜视频| 亚洲aⅴ日韩av电影在线观看| 国外成人免费在线播放| 欧美在线视频免费播放| 国产国语videosex另类| 欧美精品久久久久| 国产又爽又黄的激情精品视频| 国产日韩在线看片| 亚洲人成毛片在线播放| 色妞欧美日韩在线| 亚洲男子天堂网| 在线观看视频99| 亚洲国产精品久久91精品| 亚洲国产高清福利视频| 欧美激情视频网站| 国产成人一区二区| 成人午夜在线视频一区| 欧美激情xxxxx| 国产69精品99久久久久久宅男| 亚洲国产精品小视频| 国产成人亚洲精品| 日韩精品小视频| 国产精品久久国产精品99gif| 欧美大人香蕉在线| 91在线观看免费高清完整版在线观看| 在线精品高清中文字幕| 欧美一级黑人aaaaaaa做受| 欧美午夜丰满在线18影院| 91视频国产高清| 中文字幕亚洲无线码在线一区| 国产亚洲精品日韩| 欧美国产亚洲精品久久久8v| 国产手机视频精品| 亚洲桃花岛网站| 久久网福利资源网站| 国产精品久久久久久一区二区| 久久精品视频亚洲| 日韩成人久久久| xvideos亚洲人网站| 国产精品成人观看视频国产奇米| 亚洲国产精彩中文乱码av| www.日韩.com| 97涩涩爰在线观看亚洲| 日韩高清电影免费观看完整| 精品亚洲一区二区三区在线观看| 欧美激情一区二区三区久久久| 一本大道香蕉久在线播放29| 日本一欧美一欧美一亚洲视频| 亚洲最大福利网| 久久久av电影| 国产精品日韩欧美| 亚洲一区二区久久久久久| 精品国产一区二区三区在线观看| 一区二区三区高清国产| 91九色国产在线| 欧美有码在线视频| 色中色综合影院手机版在线观看| 欧美日韩国产一区在线| 欧美激情在线狂野欧美精品| 亚洲精品福利在线| 国产欧美精品一区二区三区介绍| 欧美一级大片视频| 中文字幕欧美精品日韩中文字幕| 久久国产一区二区三区| 成人h视频在线观看播放| 欧美日韩国产一区二区| 97福利一区二区| 狠狠操狠狠色综合网| 不卡中文字幕av| 日韩一二三在线视频播| 欧美大尺度激情区在线播放| 欧美疯狂xxxx大交乱88av| 成人激情电影一区二区| 欧美日韩性生活视频| 日韩中文字幕精品视频| 日韩欧美国产网站| 国产丝袜一区视频在线观看| 精品视频9999| 欧美性做爰毛片| 97视频在线观看视频免费视频| 中文字幕久精品免费视频| 97精品一区二区三区| 亚洲第一区中文99精品| 日韩在线欧美在线| 亚洲免费电影在线观看| 国产精品高潮呻吟久久av野狼| 欧美成人免费全部| 日韩av在线一区| 国内精品久久久久伊人av| 色综合亚洲精品激情狠狠| 国产亚洲一区精品| 日本一区二区在线播放| 黑人极品videos精品欧美裸| 久久久久久久久综合| 亚洲精品久久久久久久久久久| 久久九九有精品国产23| 日韩亚洲综合在线| 日韩在线视频线视频免费网站| 91久久中文字幕| 久久夜精品香蕉| 98精品在线视频| 久久最新资源网| 精品久久久一区| 日韩精品中文在线观看| 日本精品免费一区二区三区| 亚洲伊人久久大香线蕉av| 亚洲欧美一区二区精品久久久| 亚洲а∨天堂久久精品喷水| 欧美日韩国产精品一区二区三区四区| 91精品久久久久久久久久入口| 97国产成人精品视频| 欧美电影免费在线观看| 中文字幕日韩免费视频| 国产精品久久久久久久久久免费| 日韩在线视频免费观看|