在前一篇文章咱們介紹了OC中的協議的概念:http://blog.csdn.net/jiangwei0910410003/article/details/41776015,這篇文章咱們就來介紹一下OC中的代理模式,關於代理模式,若是還有同窗不太清楚的話,就本身去補充知識了,這裏就不作介紹了,這裏只介紹OC中是如何實現代理模式的。java
這裏舉一個簡單的例子:函數
小孩類,護士類,保姆類,其中小孩類有兩個方法:wash和playoop
這裏代理對象就是:護士類、保姆類,小孩類是被代理對象。測試
看一下代碼:ui
首先看一下小孩類:spa
Children.h.net
// // Children.h // 12_DesignStyle // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> @class Children;//若是沒有這行代碼的話,協議ChildrenDelegate中得Children類型就會查找不到,報錯 @protocol ChildrenDelegate <NSObject> @required - (void)wash:(Children *)children; - (void)play:(Children *)children; @end @interface Children : NSObject{ //Nure *_nure;//保姆 //這裏可使用多態技術實現,由於保姆,護士有共同的父類NSObject,可是這裏不使用這種方式,而是使用id類型 //可是咱們還須要爲這個類型添加一些方法,這裏就用到了協議 //這個代理對象必須聽從ChildrenDelegate協議 id<ChildrenDelegate> _delegate;//這個變量就是小孩的代理對象 NSInteger timeValue; } -(void)setDelegate:(id)delegate; @end這裏,咱們定義了一個協議:ChildrenDelegate,他有兩個必要的方法:wash和play
咱們還定義了一個很重要的屬性代理
_delegate指針
這個屬性定義有點不同,這個就是實現代理對象的精髓所在了,id是不肯定類型,因此這個_delegate變量能夠被賦值爲的類型是:code
只要實現了ChildrenDelegate協議的類就能夠了。這裏就記住了,之後這種定義方法後面會用到不少。至關於Java中的接口類型,只能賦值其實現類的類型。只是這裏的定義格式爲:id<協議名>
而後就是一個設置協議的方法了,注意參數類型也必須是id的
其實這裏面也牽涉到了以前說到的多態特性,因此說代理模式也是創建在多態的特性上的。
Children.m
// // Children.m // 12_DesignStyle // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import "Children.h" //這裏用到了保姆的一些動做 //假如如今想請一個護士,那麼咱們又要去重新去請一個護士,那麼這裏面代碼須要改,把保姆的地方換成護士的地方 //產生的緣由就是由於耦合度過高了,保姆和孩子耦合在一塊兒,若是須要換的話,就須要改動代碼 // @implementation Children - (id)init{ self = [super init]; if(self != nil){ [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES]; } return self; } -(void)setDelegate:(id)delegate{ _delegate = delegate; } - (void)timerAction:(NSTimer *)timer{ timeValue++; if(timeValue == 5){ [_delegate wash:self]; } if(timeValue == 10){ [_delegate play:self]; } } @end咱們自定義了一個初始化方法,在初始化方法中咱們作了一個定時器的工做。
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];這個就是OC中啓動一個簡單的計時器:每隔1s中就去執行一次self中的timerAction方法。
OC中的定時器和java不同,他的執行邏輯能夠單獨的在一個指定的方法中去作(C中的函數指針差很少,只要傳遞一個函數指針過來,就能夠執行指定的函數,因此@selector作的工做就是這個),可是Java中必須實現Runable接口,在run方法中執行指定的邏輯代碼。
在timerAction方法中,咱們是判斷當時間到5s了,就執行代理對象的wash方法,10s的時候執行play方法。
在來看一下護士類:
Nure.h
// // Nure.h // 12_DesignStyle // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> #import "Children.h" @interface Nure : NSObject<ChildrenDelegate> - (void)wash:(Children *)children; - (void)play:(Children *)children; @end護士類很簡單,實現ChildrenDelegate協議
Nure.m
// // Nure.m // 12_DesignStyle // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import "Nure.h" #import "Children.h" @implementation Nure - (void)wash:(Children *)children{ NSLog(@"小孩髒了,保姆幫小孩洗澡"); } - (void)play:(Children *)children{ NSLog(@"小孩哭了,保姆和小孩玩耍"); } @end在這裏就去實現wash和play方法了
在來看一下保姆類:
Nanny.h
// // Nanny.h // 12_DesignStyle // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> #import "Children.h" @interface Nanny : NSObject<ChildrenDelegate> - (void)wash:(Children *)children; - (void)play:(Children *)children; @end
// // Nanny.m // 12_DesignStyle // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import "Nanny.h" #import "Children.h" @implementation Nanny - (void)wash:(Children *)children{ NSLog(@"小孩髒了,護士幫小孩洗澡"); } - (void)play:(Children *)children{ NSLog(@"小孩哭了,護士和小孩玩耍"); } @end保姆類和護士類的代碼邏輯是同樣的,由於他們兩個都是實現了一個協議
測試類
main.m
// // main.m // 12_DesignStyle // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> #import "Children.h" #import "Nure.h" #import "Nanny.h" //核心:id類型+協議 //作到低耦合操做 //同時也能夠作到兩個類之間的通訊 int main(int argc, const char * argv[]) { @autoreleasepool { Children *child = [[Children alloc] init]; Nure *nure = [[Nure alloc] init]; Nanny *nanny= [[Nanny alloc] init]; [child setDelegate:nanny]; // [child setNure:nure]; [[NSRunLoop currentRunLoop] run]; } return 0; }看到了,測試類很簡單。咱們也發現了,代理模式的好處也是顯現出來了,好比如今又來了一我的來照顧孩子:媽媽類,那麼咱們只要讓媽媽類實現那個協議便可。這種耦合度也不會很高。因此代理模式仍是超級有用的,並且咱們後面在開發IOS的時候,會發現他裏面用到的代理模式不少的。
運行結果:
總結
這一篇就介紹了OC中如何實現代理模式,其實OC中的代理模式核心技術是:id類型+協議+多態