1. 程式人生 > >Objective-C中的協議和代理(委託)設計模式

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),之後就可以接受到當前應用程式的狀態訊息並做出相應處理。比如記憶體不夠的錯誤,應用程式被中斷等重要訊息。