標籤: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)