首页 > 代码库 > IOS常用设计模式——委托模式(IOS开发)

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,除了要实现委托协议外,还需要实现数据源协议。都是委托设计模式的具体应用。

委托的方法是可选的,但数据源的方法一般是必须实现的!


IOS常用设计模式——委托模式(IOS开发)