第一次接觸到委託是在學習《大話設計模式》的時候碰到的,我是一名Javaer,那本書是.Net的,裡面提到了委託這個概念,並且有相應的用法與支援,當時覺得挺奇怪,怎麼Java中沒有遇到過呢?後來才知道,Java沒有明確的相應支援,感覺委託很像依賴,彙總,代理,事件監聽,所以很長一段時間沒有去真正的搞明白它,以為這些就是委託,今天學習到Objective-C中的委託的時候,才發現這些不是,仔細的研究再加上與Java相結合最後自己得出了委託的定義,雖然很像之前說的那些方式,但還是有一定的區別:
1)僱主與委託者共同參與一個處理,說白了就是調用僱主方法的時候在僱主的方法內不但有相應的邏輯處理,還得請求委託者的方法共同處理
2)請求委託者的方法時要將自己傳遞過去,也就是說把自己當作一個入參傳遞過去,當然也可以有不同的實現,只是委託者能獲得僱主就可以
就這兩點,一下子就區分了其它的概念,像卻不是,但是Java中有一個技術確實是完全的委託的應用,就是事件監聽,記不記得Swing的ActionListener,所以搞明白這個,委託是怎麼回事也就清楚了,當然這裡就不說了,自己思考,下面是我寫的一個簡單的委託在Objective-C中的小Demo,事先說明,一般情況下要運行反射才算是真正的一個委託,而不應該像我寫的例子一樣寫入程式碼固定的類,我只是為了說明一下委託,而且,不怕大家見笑,我還不會Objective-C的動態反射,Java的委託例子網上多的是,我也就i不寫Java的了,只是一起明白一下委託的概念及具體的應用的好了,代碼如下:
#import <Cocoa/Cocoa.h>
/**
*委託的Demo
*
*@author 王碩
**/
//委託類,委託類沒有任何方法聲明,它只需實現非正規協議的中需要的方法
@interface DemoDelegate : NSObject
@end//DemoDelegate
//僱主類
@interface Demo : NSObject {
//委託類
DemoDelegate *demoDelegate;
}
-(void) setDemoDelegate : (DemoDelegate *) delegate;
-(void) sendMessage;
@end//Demo
//NSObject的WSDelegate類別,定義非正規協議
@interface NSObject (WSDelegate)
-(void) setDemoDelegate : (DemoDelegate *) delegate;
-(void) handlerDelegate: (Demo *) demo;
@end//WSDelegate
@implementation Demo
-(void) setDemoDelegate : (DemoDelegate *) delegate {
[delegate retain];
[demoDelegate release];
demoDelegate = delegate;
}
//通知委託類方法執行
-(void) sendMessage {
[demoDelegate handlerDelegate : self];
}
-(void) dealloc {
[demoDelegate release];
[super dealloc];
}
@end//Demo
@implementation DemoDelegate
//相應的委託方法
-(void) handlerDelegate : (Demo *) demo {
NSLog(@"%@", demo);
}
@end//DemoDelegate
int main (int argc, char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Demo *demo = [[Demo alloc] init];
DemoDelegate *delegate = [[DemoDelegate alloc] init];
[demo setDemoDelegate : delegate];
[demo sendMessage];
[pool release];
return (0);
}
當然,上面的代碼注釋沒有寫的特別詳細,因為相信如果你在學習Objective-C的委託,那麼你一定掌握了Objective-C的基本知識,上面的代碼是很簡單的,你肯定可以看的懂,這些都是我綜合資料之後總結的概念,如果哪裡有不對的地方還希望和大家多交流,希望對大家有協助.