iOS_代理設(shè)計模式

舉一個簡單的例子:
在生活中,你想去看電影,首先要有電影票,但是你很忙,沒有時間去買,所以你會找你的朋友幫你代買電影票,你的朋友說“ 幫你買電影票沒問題,把要買電影的名字告訴我,我知道名字好買票 ”,之后他就按照你告訴他的電影票名字去買相應(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];

就寫到這里了,希望對大家有所幫助

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容