委托模式在之前的博客中用到了很多,比如各種復雜的Cocoa Touch框架的UI控件,幾乎都用到了委托來響應控件事件或控制其他對象。
委托模式
-問題:
處理一切IOS應用都在UIApplication中完成,但是在設計過程中並不友好,它藕合度高,職責不清,難以維護,需要不斷不斷的重構,因此需要把看似功能很復雜的類分解或者分派成功能明確的類。
Apple中我們經常用兩種類,一個是框架類,各種用,不斷的用,啥都能用;另一個就是協議類,就是協議。
協議的目的,終究是降低一個對象的復雜度和藕合度。框架類經常會生成一個保持對象的指針,並在特定時刻向委托對象發送消息。就像我們常見的“obj delegate = self;”委托對象做些事情或者委托對象控制。
- 原理:
// 委托類PhilosopherDelegate.h @protocol PhilosopherDelegate@required - (void) sleep; - (void) eat; - (void) work; @end // ViewController.h @interface ViewController : UIViewController @end // ViewController.m @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; Philosopher *obj = [[Philosopher alloc] init]; obj.delegate = self; [obj start]; } #pragma -- PhilosoperDelegate方法實現 - (void) sleep { NSLog(@"Sleep..."); } - (void) eat { NSLog(@"eat..."); } - (void) work { NSLog(@"work..."); } @end
雖然通用類(一般都是UIViewController之類的東東)是UIKit直接提供,但是我們在這個例子中得實現自己的通用類Philosopher,我給出代碼,但是真的不是很重要的部分。
// Philosopher.h #import "PhilosopherDelegate.h" @interface Philosopher :NSObject { ... } // 可以保存對象的引用 @property (nonatomic, weak) iddelegate; - (void) start; - (void) handle; @end // Philosopher.m #import "Philosopher.h" @implementation Philosopher @synthesize delegate; -(void)start { ... } -(void)handle { ... } @end
委托的方法是可選的,但數據源的方法一般是必須實現的!