IOS常用设计模式——委托模式(IOS开发)
委托模式在之前的博客中用到了很多,比如各种复杂的Cocoa Touch框架的UI控件,几乎都用到了委托来响应控件事件或控制其他对象。
委托模式
-问题:
处理一切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语句来指定委托对象和通用类的引用关系。
虽然通用类(一般都是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,除了要实现委托协议外,还需要实现数据源协议。都是委托设计模式的具体应用。
委托的方法是可选的,但数据源的方法一般是必须实现的!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。