你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> IOS常用設計模式——委托模式(IOS開發)

IOS常用設計模式——委托模式(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,除了要實現委托協議外,還需要實現數據源協議。都是委托設計模式的具體應用。

委托的方法是可選的,但數據源的方法一般是必須實現的!


  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved