IOS常用設計模式——委託模式(IOS開發)
委託模式在之前的部落格中用到了很多,比如各種複雜的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
注意,viewDidLoad方法中的obj.delegate = self語句來指定委派物件和通用類的參考關聯性。
雖然通用類(一般都是UIViewController之類的東東)是UIKit直接提供,但是我們在這個例子中得實現自己的通用類Philosopher,我給出代碼,但是真的不是很重要的部分。
// Philosopher.h#import "PhilosopherDelegate.h"@interface Philosopher :NSObject{ ...}// 可以儲存對象的引用@property (nonatomic, weak) id delegate;- (void) start;- (void) handle;@end// Philosopher.m#import "Philosopher.h"@implementation Philosopher@synthesize delegate;-(void)start{ ...}-(void)handle{ ...}@end
- 具體應用:太多了,好多空間都有委託,主要負責響應控制項事件或控制其他對象。對於那些更複雜的控制項,如UITableView,除了要實現委託協議外,還需要實現資料來源協議。都是委託設計模式的具體應用。
委託的方法是可選的,但資料來源的方法一般是必須實現的!