舉一個簡單的例子:
在生活中,你想去看電影,首先要有電影票,但是你很忙,沒有時間去買,所以你會找你的朋友幫你代買電影票,你的朋友說“ 幫你買電影票沒問題,把要買電影的名字告訴我,我知道名字好買票 ”,之后他就按照你告訴他的電影票名字去買相應(yīng)的票,他幫你買好之后,便給你送過去。
幫忙買電影票的朋友----就是你的代理(代理對象),代理做一些事情,
在代碼中的體現(xiàn),你想去讓某一個類實現(xiàn)一個方法/功能,可以讓其他的類幫忙完成,由幫忙的類,去實現(xiàn)相應(yīng)的方法 ,然后返回一些信息。
具體代碼講解:
1、創(chuàng)建一個 person 類
.h 文件 :
-(void) buyTicket;
.m 文件 :
// 買電影票
-(void) buyTicket {
// 我很忙,讓朋友(代理對象)幫我去買電影票
}
2、 創(chuàng)建一個 Friend 類 (讓他幫你買票,送票)
3、在 person 類里面導入 #import"Friend.h" // (讓他幫我去買票)
4、在 person.h 文件聲明一個代理屬性
// 這個屬性 (我這個朋友delegate,他會幫我買票)
@property (nonatomic,weak) Friend * delegate;
5、之后:
-(void) buyTicket {
// 我很忙,讓朋友(代理對象)幫我去買電影票
[_delegate goToBuyTicket];
[_delegate numberOfTicketes];
// 所以我這個朋友 _delegate 要有這兩個方法:
}
6、在 Friend 類里面:
.h 文件
// 返回票價
-(double) goToBuyTicket;
// 返回票數(shù)
-(int) numberOfTicketes;
.m 文件
-(double) goToBuyTicket {
return 45.00;
}
-(int) numberOfTicketes {
return 3;
}
7、 在 person.m 中
-(void) buyTicket {
NSLog(@"\n \n ======= 我很忙,讓朋友(代理對象)幫我去買電影票");
//返回價錢
double pirce = [_delegate goToBuyTicket];
//返回買了幾張
int number = [_delegate numberOfTicketes];
NSLog(@"%d--%d",pirce, number);
}
具體調(diào)用
person *p = [person alloc]init];
Friend * a = [Friend alloc]init];
p.delegate = a;
[p buyTicket];
// 以上就是簡單的代理模式 我不想做的事情,讓別人幫我代理完成 本類無法完成的事情讓別的類幫助完成。
// 這種事耦合性太強了,如果Friend 有事 就會出錯
如何解決呢?
// 后來 你家人 感覺這里面有商機,幫人買票送票,開了一家店 店名叫做 「協(xié)議」 任何人只要想買票只要遵守協(xié)議 (協(xié)議里面有工作說明) 就會有--代理--幫他買。 (代理對象會按照工作流程工作)
在 person.h 文件聲明一個代理屬性
@property (nonatomic,weak) id delegate;
我們改為id 類型 也就是任何類型的對象 都可以做我們的代理
聲明一份協(xié)議 Tickeetprotocol.h
@protocol TicketDelegate <NSObject>
//返回票價
-(double) goToBuyTicket;
//返回票數(shù)
-(int) numberOfTicketes;
@end
在person.h 文件
導入頭文件 #import "Ticketprotocol.h"
@property (nonatomic,weak) id delegate;
// 但是我不知道 deldgate 里面有那些方法 (相當于我知道你是幫忙買票的,可是你的流程都有什么?)!
所以就改為
@property (nonatomic,weak) id<TicketDelegate> delegate;
// 要求 delegate 必須遵守 TicketDelegate 協(xié)議
// (解讀:id 代理的類名 隨便幫你買票的那個人必須遵守TicketDelegate協(xié)議)
創(chuàng)建一個叫做 Xiaohong 的類,因為有了 "協(xié)議"店
Xiaohong 想作為代理 幫人們買票 ,所以 Xiaohong 直接在" 協(xié)議"店報了名,“協(xié)議店”承認他可以作為代理幫忙買票,并且告訴xiaohong要做哪些事情
@interface Xiaohong :NSobject <TicketDelegate>
在Xiaohong.m 文件
-(double) goToBuyTicket {
return 45.00;
}
-(int) numberOfTicketes {
return 3;
}
person *p = [person alloc]init];
Xiaohong * hong = [people alloc]init];
p.delegate = hong;
[p buyTicket];
創(chuàng)建一個叫做 Xiaoli的類,
Xiaoli 也 想作為代理 幫人們買票 ,所以 Xiaoli 也在" 協(xié)議"店報了名,“協(xié)議店”承認他可以作為代理幫忙買票,并且告訴xiaoli要做哪些事情
@interfaceXiaoli :NSobject <TicketDelegate>
在Xiaoli.m 文件
-(double) goToBuyTicket {
return 45.00;
}
-(int) numberOfTicketes {
return 3;
}
person *p = [person alloc]init];
Xiaoli * li = [Xiaoli alloc]init];
//xiaohong的態(tài)度不好,所以換了一個人買票
p.delegate = li;
[p buyTicket];
就寫到這里了,希望對大家有所幫助