1.情景理解代理模式:
之前老王借給李賴皮2000塊錢,可是一直沒有拿回這個(gè)錢烈拒,老王想通過法律途徑把這筆錢要回來圆裕,可是自己沒有這個(gè)能力或者是自己不愿意直接面對(duì)李賴皮,就打算找一個(gè)代理律師幫自己要回這筆錢荆几,整個(gè)過程也就是老王通過律師要回錢吓妆。
老王: 委托方
律師: 代理方
前期準(zhǔn)備工作一(老王寫協(xié)議的準(zhǔn)備工作)
老王想找個(gè)律師給自己干活,并且還得告訴律師自己需要律師做什么事情以及怎么去做吨铸,那就得簽一個(gè)幫他要錢的協(xié)議(GetMoneyDelegate):協(xié)議如下(寫在Person.h):
// Person.h
#import <Foundation/Foundation.h>
//定義協(xié)議和方法
@protocol GetMoneyDelegate <NSObject>
-(void)getMoney:(NSString *)name value:(NSString *)money;
@end
@interface Person : NSObject
//聲明委托變量
@property(nonatomic,retain) id<GetMoneyDelegate> person_delegate;
-(void)wantMoneyBack;
@end
向誰要錢行拢?又要多少錢呢?這個(gè)是老王需要告訴律師的诞吱,所以協(xié)議里面寫了一個(gè)要錢的方法舟奠,并且這個(gè)方法帶了參數(shù):欠債人名字和金額:
-(void)getMoney:(NSString *)name value:(NSString *)money;
另外協(xié)議里面還有一個(gè)person_delegate,這是老王在協(xié)議里聲明的一個(gè)代理,找的代理律師回頭賦值到這個(gè)代理房维,代理律師就可以做事了沼瘫。
通過這樣一個(gè)協(xié)議,老王回頭在自己的.m文件中wantMoneyBack的時(shí)候告訴自己的代理去執(zhí)行要錢的方法咙俩,并且告訴向誰要錢伍纫,要多少錢就行了,至于代理怎么去做就不管自己的事了堕澄,老王就可以睡大覺等著了。這一切放在Person.m中:
// Person.m
#import "Person.h"
@implementation Person
-(void)wantMoneyBack{
NSLog(@"我想要回我的錢");
[self.person_delegate getMoney:@"李賴皮" value:@"2000"];
}
@end
前期準(zhǔn)備工作二(律師的準(zhǔn)備工作)
首先晓锻,律師想去為老王要錢,那么就必須遵守老王的協(xié)議飞几,這樣律師才知道應(yīng)該向誰要錢并且要多少錢砚哆,所以律師在自己的Lawyer.h中遵守老王的協(xié)議:
// Lawyer.h
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Lawyer : NSObject<GetMoneyDelegate>
@end
并且在自己的Lawyer.m中實(shí)現(xiàn)協(xié)議中的要錢方法:
// Lawyer.m
#import "Lawyer.h"
@implementation Lawyer
-(void)getMoney:(NSString *)name value:(NSString *)money{
//下面就是代理需要幫委托方做的事情,做什么事情怎么做等參數(shù)是委托方傳遞的
NSLog(@"本律師幫你向%@要回了%@元錢",name,money);
}
@end
然后接下來就是真正的律師干活的階段了
干活階段
在ViewController.m中:
// ViewController.m
#import "ViewController.h"
#import "Person.h"
#import "Lawyer.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
Person *laowang = [Person new];
Lawyer *lawyer = [Lawyer new];
//老王找到律師給自己做代理
laowang.person_delegate = lawyer;
//只有老王的代理也就是律師實(shí)現(xiàn)了要錢的方法屑墨,老王這個(gè)委托方才有底氣說要錢
if ([lawyer respondsToSelector:@selector(getMoney:value:)]) {
[laowang wantMoneyBack];
}
}
@end
執(zhí)行結(jié)果如下:
所以這整個(gè)過程我們就可以看到躁锁,老王這個(gè)對(duì)象僅僅調(diào)用了自己的wantMoneyBack方法,方法體里是讓自己的代理為自己做事卵史,并且把參數(shù)設(shè)置好战转,并沒有自己親自去要錢,就達(dá)到了要錢的目的以躯。
-(void)wantMoneyBack{
NSLog(@"我想要回我的錢");
[self.person_delegate getMoney:@"李賴皮" value:@"2000"];
}
2.代理模式在iOS中的應(yīng)用
代理在iOS中有一個(gè)重要的應(yīng)用就是反向傳值槐秧,比如有兩個(gè)控制器AViewController和BViewController,點(diǎn)擊A的跳轉(zhuǎn)按鈕就能跳到B控制器忧设,在B控制器的textField上輸入字符串并且點(diǎn)擊返回刁标,回到A控制器后,字符串顯示在A控制器的視圖上址晕。顯然膀懈,B控制器是沒有能力在A控制器上顯示自己內(nèi)部的字符串的,但是我們可以通過代理的方式來實(shí)現(xiàn)谨垃。
可以參考這篇文章:
https://www.cnblogs.com/jukaiit/p/5021730.html