委託模式在Cocoa Touch框架和Cocoa框架中都有不少的應用。例如在應用啓動的時候須要的一個類:UIApplication。在程序的入口函數main函數裏面:框架
int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([WBAppDelegate class])); } }
UIApplication的方法UIApplicationMain函數設置了它的委託類:WBAppDelegate。UIApplication不直接依賴於WBAppDelegate類,而是依賴於UIApplicationDelegate協議,WBAppDelegate類實現協議UIApplicationDelegate,WBAppDelegate是一個委託類。函數
委託是爲了下降一個對象的複雜度和耦合度,使其可以更具通用性而將一些處理置於委託對象中得編碼方式。通用類由於通用性而變成框架類,框架類保持委託對象的指針,並在特定的時刻向委託對象發送消息。消息可能只是通知委託對象作一些事情,也多是對委託對象的控制。ui
下面經過一個班主任老師和班長的例子來介紹一下委託模式的實現原理和應用場景。老師(Teacher)爲了更好的管理班級須要任命一位同窗爲班長(Monitor),老師但願班長能幫助他作兩件事情:編碼
一、發佈一些信息(sendMessage)atom
二、收集同窗們的一些狀況(collectSomething)spa
也就是說,老師爲了更好地工做,須要將這兩件事情委託給班長來作,然而要成爲班長,須要實現一個協議,這個協議要求可以處理「發佈一些信息」和「收集同窗們的一些狀況」。先定義一個Teacher類:指針
#import @protocol WBTeacherDelegate @required - (void)sendMessage; - (void)collectSomething; @end @interface WBTeacher : NSObject @property (nonatomic, weak) id delegate; @end
// // WBTeacher.m // DesignPatternsDemo // // Created by 韓學鵬 on 15/6/22. // Copyright (c) 2015年 韓學鵬. All rights reserved. // #import "WBTeacher.h" @implementation WBTeacher @end
Teacher類就是上面所說的通用類,它經過delegate屬性保持委託對象的引用,委託對象就是班長,他須要實現協議WBTeacherDelegate。WBTeacherDelegate協議規定了兩個方法:sendMessage和collectSomething。調試
下面來實現班長類:code
// // WBMonitor.h // DesignPatternsDemo // // Created by 韓學鵬 on 15/6/22. // Copyright (c) 2015年 韓學鵬. All rights reserved. // #import #import "WBTeacher.h" @interface WBMonitor : NSObject @end
// // WBMonitor.m // DesignPatternsDemo // // Created by 韓學鵬 on 15/6/22. // Copyright (c) 2015年 韓學鵬. All rights reserved. // #import "WBMonitor.h" @implementation WBMonitor - (id)init { self = [super init]; WBTeacher *teacher = [[WBTeacher alloc] init]; teacher.delegate = self; [teacher doSomething:0]; [teacher doSomething:1]; return self; } - (void)sendMessage { NSLog(@"monitor:send message..."); } - (void)collectSomething { NSLog(@"monitor:collect something..."); } @end
而後修改一下Teacher類:對象
// // WBTeacher.h // DesignPatternsDemo // // Created by 韓學鵬 on 15/6/22. // Copyright (c) 2015年 韓學鵬. All rights reserved. // #import @protocol WBTeacherDelegate @required - (void)sendMessage; - (void)collectSomething; @end @interface WBTeacher : NSObject @property (nonatomic, weak) id delegate; - (void)doSomething:(int)tag; @end // // WBTeacher.m // DesignPatternsDemo // // Created by 韓學鵬 on 15/6/22. // Copyright (c) 2015年 韓學鵬. All rights reserved. // #import "WBTeacher.h" @implementation WBTeacher - (void)doSomething:(int)tag { if (!_delegate) { return; } switch (tag) { case 0: [_delegate sendMessage]; break; case 1: [_delegate collectSomething]; break; default: break; } } @end
能夠看到,委託協議WBTeacherDelegate定義了兩個方法,他得實現類是WBMonitor。WBTeacher類中定義doSometing:方法是爲了調試方便模擬老師向班長髮送消息的方法。
委託對象和通用類經過WBMonitor類中的init方法中的teacher.delegate = self來創建關係。調試輸出內容以下:
2015-06-22 09:08:47.991 DesignPatternsDemo[26365:607] monitor:send message... 2015-06-22 09:08:47.993 DesignPatternsDemo[26365:607] monitor:collect something...
附WBTeacher和WBMonitor類的下載地址:委託模式