Objective-c 代理模式(delegate)

來源:互聯網
上載者:User

標籤:style   io   ar   color   os   sp   for   檔案   on   

Objective-c 代理模式(delegate)   一、什麼事代理模式?        代理模式是在oc中經常遇到的一種設計模式,那什麼叫做代理模式呢? 舉個例子:有一個嬰兒,他本身不會自己吃飯和洗澡等等一些事情,於是嬰兒就請了一個保姆,於是嬰兒和保姆之間商定了一個協議,協議中寫明了保姆需要做什麼事情, 而保姆就是這個代理人,  即:嬰兒和保姆之間有個協議,保姆繼承該協議,於是保姆就需要實現該協議中的條款成為代理人。 二、 代理模式的關鍵點:     A完成一件事,但是自己不能完成,於是他找個代理人B 替他完成這個事情,他們之間便有個協議 (protocol),B繼承該協議來完成A代理給他的事情。  三、執行個體分析    下面來舉一個經典的執行個體,媽媽和保姆的例子:媽媽把孩子委託給保姆照顧,於是將需要完成的事情寫成一個協議:協議聲明如下:

#import <Foundation/Foundation.h>

@protocol Job <NSObject>

-(void)takeEat;

-(void)takeSleep;

-(void)takePlay;

-(void)takeShower;

@end

我們再聲明Nurse類 即代理的人:

 

#import <Foundation/Foundation.h>

#import "Job.h"

@interface Nurse : NSObject<Job>//實現該協議

@end

實現檔案:

 

#import "Nurse.h"

@implementation Nurse

-(void)takeEat

{

    NSLog(@"小孩餓了,喂它吃飯");

}

-(void)takeSleep

{

    NSLog(@"小孩困了,哄他睡覺");

}

-(void)takePlay

{

    NSLog(@"小孩醒來了,陪他玩");

}

-(void)takeShower

{

    NSLog(@"晚上給小孩洗澡");

}

-(void)dealloc

{

    NSLog(@"Nurse is dealloc");

}

@end

再聲明一個morther類:

#import <Foundation/Foundation.h>

#import "Job.h"

@class Nurse;

@interface Morther : NSObject

{

    NSString *name;

    id<Job> delegate;   //此處聲明一個代理人,從而mother可以讓代理人完成需要代理的事情

}

-(id)initWithName:(NSString *)_name delagat:(id<Job>)_delagete;  //傳入代理人

@property(nonatomic,copy)NSString *name;

-(void)delagateThings;// 被代理的事情

@end

//實現檔案

 

#import "Morther.h"

#import "Nurse.h"

@implementation Morther

-(id)initWithName:(NSString *)_name delagat:(id)_delagete

{

    self=[super init];

    if (self) {

        if (name!=_name) {

            [name release];

            name=[_name copy];

            [delegate release];

            delegate=[_delagete retain];

        }

    }

    return self;

}

@synthesize name;

-(void)dealloc

{

    [name release];

    [delegate release];

    NSLog(@"host is dealloc");

}

-(void)delagateThings

{

    int i;

    switch (i) {

        case 1:

            [delegate takeEat];

            break;

        case 2:

            [delegate takePlay];

            break;

        case 3:

            [delegate takeShower];

            break;

        case 4:

            [delegate takeSleep];

            break;

        default:

            break;

    }

    i++;

}

@end

 

看看 在 main 檔案中是怎麼實現的:

 

#import <Foundation/Foundation.h>

#import "Morther.h"

#import "Nurse.h"

#import "Job.h"

int main (int argc, const char * argv[])

{

 

    @autoreleasepool {

        

        NSString *name=[[NSString alloc] initWithFormat:@"小花"];

        Nurse *fengjie=[[Nurse alloc] init];//代理人 fengjie

        Morther *morther=[[Morther alloc] initWithName:name delagat:fengjie];//這樣就將代理人傳入mother 對象中,這樣morther對象便可以通過nurse來完成她自己不能坐的事情了。

        [name release];

        [NSTimer scheduledTimerWithTimeInterval:2 target:mortherselector:@selector(delagateThings) userInfo:nil repeats:YES];  //調用機制,  2秒調用一次, 調用的對象是morther , 調用的方法是delagateThings;

        [[NSRunLoop currentRunLoop] run];  //讓程式一直運行下去,保證上面的調用可以一直進行

        [morther release];

        [fengjie release];    

    }

    return 0;

}

 

代理中,需要記住的關鍵是在發出代理請求的類(A)中聲明代理人(B)的執行個體變數,這樣就可以保證A 能通過調用B中B代理的方法來完成B代理的事情,即自己代理給B 的事情。

Objective-c 代理模式(delegate)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.