委托模式在之前的博客中用到了很多,比如各种复杂的Cocoa Touch框架的UI控件,几乎都用到了委托来响应控件事件或控制其他对象,
IOS常用设计模式——委托模式(IOS开发)
。委托模式
-问题:
处理一切IOS应用都在UIApplication中完成,但是在设计过程中并不友好,它藕合度高,职责不清,难以维护,需要不断不断的重构,因此需要把看似功能很复杂的类分解或者分派成功能明确的类。
Apple中我们经常用两种类,一个是框架类,各种用,不断的用,啥都能用;另一个就是协议类,就是协议。
协议的目的,终究是降低一个对象的复杂度和藕合度。框架类经常会生成一个保持对象的指针,并在特定时刻向委托对象发送消息。就像我们常见的“obj delegate = self;”委托对象做些事情或者委托对象控制。
- 原理:
// 委托类PhilosopherDelegate.h@protocol PhilosopherDelegate<NSObject>@required- (void) sleep;- (void) eat;- (void) work;@end// ViewController.h@interface ViewController : UIViewController<PhilosopherDelegate>@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语句来指定委托对象和通用类的引用关系,
电脑资料
《IOS常用设计模式——委托模式(IOS开发)》(http://meiwen.anslib.com)。虽然通用类(一般都是UIViewController之类的东东)是UIKit直接提供,但是我们在这个例子中得实现自己的通用类Philosopher,我给出代码,但是真的不是很重要的部分。
// Philosopher.h#import "PhilosopherDelegate.h"@interface Philosopher :NSObject{ ...}// 可以保存对象的引用@property (nonatomic, weak) id<PhilosopherDelegate>delegate;- (void) start;- (void) handle;@end// Philosopher.m#import "Philosopher.h"@implementation Philosopher@synthesize delegate;-(void)start{ ...}-(void)handle{ ...}@end
- 具体应用:太多了,好多空间都有委托,主要负责响应控件事件或控制其他对象。对于那些更复杂的控件,如UITableView,除了要实现委托协议外,还需要实现数据源协议。都是委托设计模式的具体应用。
委托的方法是可选的,但数据源的方法一般是必须实现的!