1.情景理解代理模式:
之前老王借给李赖皮2000块钱,可是一直没有拿回这个钱,老王想通过法律途径把这笔钱要回来,可是自己没有这个能力或者是自己不愿意直接面对李赖皮,就打算找一个代理律师帮自己要回这笔钱,整个过程也就是老王通过律师要回钱。
老王: 委托方
律师: 代理方
前期准备工作一(老王写协议的准备工作)
老王想找个律师给自己干活,并且还得告诉律师自己需要律师做什么事情以及怎么去做,那就得签一个帮他要钱的协议(GetMoneyDelegate):协议如下(写在Person.h):
// Person.h
#import <Foundation/Foundation.h>
//定义协议和方法
@protocol GetMoneyDelegate <NSObject>
-(void)getMoney:(NSString *)name value:(NSString *)money;
@end
@interface Person : NSObject
//声明委托变量
@property(nonatomic,retain) id<GetMoneyDelegate> person_delegate;
-(void)wantMoneyBack;
@end
向谁要钱?又要多少钱呢?这个是老王需要告诉律师的,所以协议里面写了一个要钱的方法,并且这个方法带了参数:欠债人名字和金额:
-(void)getMoney:(NSString *)name value:(NSString *)money;
另外协议里面还有一个person_delegate,这是老王在协议里声明的一个代理,找的代理律师回头赋值到这个代理,代理律师就可以做事了。
通过这样一个协议,老王回头在自己的.m文件中wantMoneyBack的时候告诉自己的代理去执行要钱的方法,并且告诉向谁要钱,要多少钱就行了,至于代理怎么去做就不管自己的事了,老王就可以睡大觉等着了。这一切放在Person.m中:
// Person.m
#import "Person.h"
@implementation Person
-(void)wantMoneyBack{
NSLog(@"我想要回我的钱");
[self.person_delegate getMoney:@"李赖皮" value:@"2000"];
}
@end
前期准备工作二(律师的准备工作)
首先,律师想去为老王要钱,那么就必须遵守老王的协议,这样律师才知道应该向谁要钱并且要多少钱,所以律师在自己的Lawyer.h中遵守老王的协议:
// Lawyer.h
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Lawyer : NSObject<GetMoneyDelegate>
@end
并且在自己的Lawyer.m中实现协议中的要钱方法:
// Lawyer.m
#import "Lawyer.h"
@implementation Lawyer
-(void)getMoney:(NSString *)name value:(NSString *)money{
//下面就是代理需要帮委托方做的事情,做什么事情怎么做等参数是委托方传递的
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;
//只有老王的代理也就是律师实现了要钱的方法,老王这个委托方才有底气说要钱
if ([lawyer respondsToSelector:@selector(getMoney:value:)]) {
[laowang wantMoneyBack];
}
}
@end
执行结果如下:
控制台打印结果
所以这整个过程我们就可以看到,老王这个对象仅仅调用了自己的wantMoneyBack方法,方法体里是让自己的代理为自己做事,并且把参数设置好,并没有自己亲自去要钱,就达到了要钱的目的。
-(void)wantMoneyBack{
NSLog(@"我想要回我的钱");
[self.person_delegate getMoney:@"李赖皮" value:@"2000"];
}
2.代理模式在iOS中的应用
代理在iOS中有一个重要的应用就是反向传值,比如有两个控制器AViewController和BViewController,点击A的跳转按钮就能跳到B控制器,在B控制器的textField上输入字符串并且点击返回,回到A控制器后,字符串显示在A控制器的视图上。显然,B控制器是没有能力在A控制器上显示自己内部的字符串的,但是我们可以通过代理的方式来实现。
可以参考这篇文章:
https://www.cnblogs.com/jukaiit/p/5021730.html
网友评论