Objective-C中的協議和代理(委託)設計模式

一、協議:  

       Objective-C中的協議(Protocol)類似於常用的接口,協議(Protocols)中定義的方法,在類中實現。協議(Protocol)通常用來實現委託對象(Delegate Object)。委託對象(Delegate Object)一般用來自己定義行爲或者動作,也就是調用自己定義方法,但自己不實現該方法,委託其它的類來實現該方法。

1. 協議的聲明:

HelloProtocol.h

#import <Foundation/Foundation.h>

@protocol HelloProtocol <NSObject>

- (void) requiredMethod;

@optional
- (void) optionalMethod1;
- (void) optionalMethod2;

@end
@required是缺省值,是必須實現的方法,@optional是可以選擇的。協議只有一個.h文件,本身不是類,他是定義了一個其他類可實現的接口。

2. 協議的實現:

Person.h

#import <Foundation/Foundation.h>
#import "HelloProtocol.h"

@interface Person : NSObject <HelloProtocol>

@end
Person.m

#import "Person.h"

@implementation Person

- (void)requiredMethod{
    NSLog(@"這是一個必須實現的方法");
}

- (void)optionalMethod1{
    NSLog(@"這是一個可選的方法1");
}

- (void)optionalMethod2{
    NSLog(@"這是一個可選的方法2");
}
@end

3. 用協議修飾變量

3.1 定義變量:

       id<MyProtocolName>myNewVariable;     

       那麼myNewVatiable是遵循我們定製的這個MyProtocolName協議的。

3.2 定義函數:

      - (void) doSomethingWithThisObject: (id<MyprotocolName>) aObject

      那麼這個函數的參數是需要遵循我們定製的這個MyProtocolName協議的。

二、代理(委託)設計模式

      代理是指一個對象提供機會給另一個對象中的行爲發生變化是做出的反應。基本思想是:兩個對象協同解決問題,通常用於對象之間的通信。
代理設計模式的基本特點:
  • 簡化了對象的行爲,最小化了對象之間的耦合度。
  • 使用代理,一般來說無需子類化。
  • 簡化了我們應用程序開發,既容易實現,有靈活。
例子:
A.h------------------------------------------------
@implementation

-(void)init

{
    delegate = B;
}

-(void)FunToOther

{
    [delegate Fun];//將消息發送給委託去處理
}

@end
A.m---------------------------------------------
@implementation

-(void)init

{
    delegate = B;
}

-(void)FunToOther

{
    [delegate Fun];//將消息發送給委託去處理
}

@end
委託對象的實現
B.h---------------------------------------------
#import"A.h"

@interface B:NSObject<MyDelegate>

@end
B.m---------------------------------------------
@implementation

-(void)fun

{
    //實現Mydelegate中制定的方法
}

@end

這樣的話A就可以委託B去做fun這件事情了。
        UIApplication類就是一個典型的例子。UIApplication類中定義了一個應用程序應有的行爲或者動作。而不是強制讓你的UIApplication子類去接受當前應用程序的狀態消息並做出相應處理。UIApplication類通過調用特殊的方法,來傳遞這些消息給它的委託對象。這個委託對象通過實現名爲UIApplicationDelegate的協議(Protocol),之後就可以接受到當前應用程序的狀態消息並做出相應處理。比如內存不夠的錯誤,應用程序被中斷等重要消息。

例子參考:http://www.cnblogs.com/cokecoffe/archive/2012/05/05/2537109.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章