【非凡程序員】 OC第十五節課 (觀察者模式和KVO進行對比)

今天主要學了觀察者模式,以及回顧複習了KVO,二者進行對比程序員

什麼是觀察者模式?函數

咱們先打個比方,這就像你訂報紙。好比你想知道美國最近放生了些新聞,你可能會訂閱一份美國週刊,而後一旦美國有了新的故事,美國週刊就發一刊,並郵寄給你,當你收到這份報刊,而後你就可以瞭解美國最新的動態。其實這就是觀察者模式,A對B的變化感興趣,就註冊爲B的觀察者,當B發生變化時通知A,告知B發生了變化。這是一種很是典型的觀察者的用法,我把這種使用方法叫作經典觀察者模式post

KVO的全稱是Key-Value Observer,即鍵值觀察。是一種沒有中心樞紐的觀察者模式的實現方式。一個主題對象管理全部依賴於它的觀察者對象,而且在自身狀態發生改變的時候主動通知觀察者對象。atom

觀察者模式是能夠觀察一個對象,這個對象的全部屬性變化,均可以進行觀察獲得spa

KVO知識觀察一個屬性的改變server

 

main函數:對象

//  main.m
//  商場打折
//
//  Created by 非凡程序員 on 15/6/5.
//  Copyright (c) 2015年 非凡程序員. All rights reserved.
//
內存

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Goods.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
   
    NSLog(@"helloworld");
    Person * person1=[[Person alloc]init];
    person1.name = @"歲歲";
   
    Person * person2=[[Person alloc]init];
    person2.name = @"平平";
   
    Goods * good1=[[Goods alloc]init];
    good1.name = @"蘋果6";
    good1.price = 5500.88;
    good1.clour=@"白色";
   
    Goods * good2=[[Goods alloc]init];
    good2.name = @"華爲P7";
    good2.price = 2000.88;
    good2.clour=@"黑色";
    //----------KVO--------//

    //註冊
    [good1 addObserver:person1 forKeyPath:@"price" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
    [good2 addObserver:person2 forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
    //改值
    good1.price = 6500.88;
    good1.name = @"蘋果6plus";
    good2.price = 3555.88;
    good2.name = @"華爲P8";
    //移除
    [good1 removeObserver:person1 forKeyPath:@"price"];
    [good2 removeObserver:person2 forKeyPath:@"name"];
  
   
    //觀察者模式
    //步驟: 註冊/接收 --> 通知 --> 移除
   
    //接收 +註冊  addObserver:觀察者 selector:@selector(repe:)repe爲方法,記得加上冒號 name:通知名稱 object:通知發送人
    //註冊(某個對象 student) + 接收的方法(@select(自定義方法名))
    //注意:每當寫入註冊對象,請在註冊對象裏寫上接收方法。
    //參數說明:addObserver: 觀察者 selector:@select(接收方法)
    //接收方法最好加:,爲了參數傳參數。name: 通知名稱 object:通知發送人 可爲nil
    [[NSNotificationCenter defaultCenter] addObserver:person1 selector:@selector(repe:) name:@"st" object:nil];
    //通知  通常爲發送通知消息
    //注意:通知名稱必須爲已註冊的通知名稱,發送的通知可爲任意對象類型
    //參數說明:postNotificationName: 通知名稱 objects: 被髮送消息
    [[NSNotificationCenter defaultCenter] postNotificationName:@"st" object:good1];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"st" object:good2];
   
    //移除 防止內存泄漏
    //方法說明: removeObserver: 觀察者 name: 通知名稱 object 發送人 該方法爲移除觀察者的消息通知
    [[NSNotificationCenter defaultCenter] removeObserver:person1 name:@"st" object:nil];
     //方法說明: removeObserver: 觀察者  該方法爲移除觀察者對象
    [[NSNotificationCenter defaultCenter] removeObserver:person1];
    
       return 0;
}
rem

Person.h 文件:產品

#import <Foundation/Foundation.h>
#import "Goods.h"

@interface Person : NSObject

@property (nonatomic,assign) NSString * name;
-(void)repe:(NSNotification *)nn;

@end

Person.m 文件:

#import "Person.h"

@implementation Person

//KVO
//回調
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{
        NSLog(@"%@想知道%@--%@的變更狀況----如今是:%@ 原來是:%@",_name,[object name],keyPath,[change valueForKeyPath:NSKeyValueChangeNewKey],[change valueForKeyPath:NSKeyValueChangeOldKey]);
//    NSLog(@"%@,[object
valueForKey:keyPath]);
//    NSLog(@"%@,[change
valueForKey:@"new"]);
//    NSLog(@%@,change[@"new"]
);
   
}

//觀察者模式
-(void)repe:(NSNotification *)nn
{
    Goods * ppp=[nn object];
    NSLog(@"%@你好--新產品名稱:%@ 價格:%.2f 顏色:%@",_name,[ppp name],[ppp price],[ppp clour]);
}

Goods.h文件:

#import <Foundation/Foundation.h>

@interface Goods : NSObject

@property (nonatomic,assign) NSString * name;
@property (nonatomic,assign) float price;
@property (nonatomic,assign) NSString * clour;
@end

Goods.m文件:

#import "Goods.h"

@implementation Goods

@end

相關文章
相關標籤/搜索