什么是代理?

  苹果的官方文档给了很清晰的解释:

  Delegation is a simple and powerful pattern in which one object in a program acts on behalf of, or in coordination with, another object. The delegating object keeps a reference to the other object—the delegate—and at the appropriate time sends a message to it. The message informs the delegate of an event that the delegating object is about to handle or has just handled. The delegate may respond to the message by updating the appearance or state of itself or other objects in the application, and in some cases it can return a value that affects how an impending event is handled. The main value of delegation is that it allows you to easily customize the behavior of several objects in one central object.

  意译一下就是:代理是一种简单而功能强大的设计模式,这种模式用于一个对象“代表”另 外一个对象和程序中其他的对象进行交互。 主对象(这里指的是delegating object)中维护一个代理(delegate)的引用并且在合适的时候向这个代理发送消息。这个消息通知“代理”主对象即将处理或是已经处理完了某一 个事件。这个代理可以通过更新自己或是其它对象的UI界面或是其它状态来响应主对象所发送过来的这个事件的消息。或是在某些情况下能返回一个值来影响其它 即将发生的事件该如何来处理。代理的主要价值是它可以让你容易的定制各种对象的行为。注意这里的代理是个名词,它本身是一个对象,这个对象是专门代表被代 理对象来和程序中其他对象打交道的。

  Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法。也就是说,它只告诉你要做什么,但具体怎么做,它不关心。

  当 一个类要使用某一个Protocol(协议)时,都必须要遵守协议。比如有些必要实现的方法,你没有去实现,那么编译器就会报警告,来提醒你没有遵守×× 协议。注意,我这里说的是警告,而不是错误。对的,就算你不实现那些“必要实现”的方法,程序也是能运行的,只不过多了些警告。

Protocol(协议)的作用:

1. 定义一套公用的接口(Public)

  • @required:必须实现的方法

  • @optional:可选 实现的方法(可以全部都不实现)

2. 委托代理(Delegate)传值:

它本身是一个设计模式,它的意思是委托别人去做某事。

比如:两个类之间的传值,类A调用类B的方法,类B在执行过程中遇到问题通知类A,这时候我们需要用到代理(Delegate)。

又比如:控制器(Controller)与控制器(Controller)之间的传值,从C1跳转到C2,再从C2返回到C1时需要通知C1更新UI或者是做其它的事情,这时候我们就用到了代理(Delegate)传值。

一、定义一套公用的接口(Public)

首先新建一个协议文件:

填上协议文件名及文件类型(选择Protocol):

ProtocolDelegate.h代码(协议不会生成.m文件):

#import @protocol ProtocolDelegate // 必须实现的方法
@required
- (void)error;// 可选实现的方法
@optional
- (void)other;
- (void)other2;
- (void)other3;@end

在需要使用到协议的类,import它的头文件:

#import "ViewController.h"
#import "ProtocolDelegate.h"

我这里选择的是入口文件

记得要遵守协议:

@interface ViewController () @end

这时会报一个警告,因为定义的协议里有一个是必须实现的方法,而我们没有去实现:

实现了必须实现的方法后,编译器就不会报警告了:

至于其它的可选方法,你可以选择实现,也可以全都不实现。

二、委托代理(Delegate)传值

在Storyboard上,先搭好界面,如下图:

新建ControllerB:

把B界面的类设置为ViewControllerB:

下面放出主要类文件代码,我在里面写了注释,大家应该能看懂。不懂也没有关系,我会在本文结尾放上Demo下载地址。

ViewController.m文件:

 1 #import "ViewController.h"
 2 #import "ProtocolDelegate.h"
 3 #import "ViewControllerB.h"
 4 @interface ViewController () @end
 5 @implementation ViewController
 6 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
 7 {
 8   ViewControllerB *vc = segue.destinationViewController;
 9   [vc setDelegate:self];
10 }
11 // 这里实现B控制器的协议方法
12 - (void)sendValue:(NSString *)value
13 {
14   UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"成功" message:value delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
15   [alertView show];
16 }
17 - (void)error
18 {
19 }
20 @end

ViewControllerB.h文件:

 1 #import // 新建一个协议,协议的名字一般是由“类名+Delegate”
 2 @protocol ViewControllerBDelegate // 代理传值方法
 3 - (void)sendValue:(NSString *)value;
 4
 5 @end
 6
 7 @interface ViewControllerB : UIViewController
 8
 9 // 委托代理人,代理一般需使用弱引用(weak)
10 @property (weak, nonatomic) id delegate;
11
12 @end

ViewControllerB.m文件:

 1 #import "ViewControllerB.h"
 2 @interface ViewControllerB ()
 3 @property (strong, nonatomic) IBOutlet UITextField *textField;
 4 @end
 5 @implementation ViewControllerB
 6 - (IBAction)backAction:(id)sender
 7 {
 8   if ([_delegate respondsToSelector:@selector(sendValue:)]) { // 如果协议响应了sendValue:方法
 9     [_delegate sendValue:_textField.text]; // 通知执行协议方法
10   }
11   [self.navigationController popViewControllerAnimated:YES];
12 }
13 @end

完成效果截图:

小结:

当你需要定义一套公用的接口,实现方法可以是不同的时候,你可以使用Protocol协议。

当你需要进行类与类之间的传值时,你也可以基于Protocol协议,使用代理设计模式进行传值。

转载于:https://www.cnblogs.com/damonWq/p/5128358.html

0113——代理模式相关推荐

  1. GOF23设计模式(结构型模式)代理模式~

    代理模式应用场景十分广泛,随便一个框架都会用到,因此学好代理模式对后续框架学习是最基本的要素!!今天我们就来讲讲代理模式! 目录 1.简介 1. 核心作用 2. 角色分析 2. 应用场景 4. 分类 ...

  2. Java 设计模式_代理模式(2016-08-19)

    概念: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...

  3. ATS 5.3.0在反向代理模式下实现正向代理功能方法

    以前,我在records.config中一般是配置成正向+反向的形式: 现在我打算改为反向代理模式,但是需要实现正向代理的功能: 同时在remap.config中配置 regex_map http:/ ...

  4. 设计模式 之美 -- 代理模式

    文章目录 1. 解决问题 2. 应用场景 1. 业务系统的非功能性开发 2. 代理模式在RPC.缓存中的应用 3. 实现 C++实现 C语言实现 1. 解决问题 客户端和目标对象之间需要进行交互,此时 ...

  5. 设计模式之代理模式(Proxy Pattern)

    定义:为其他对象提供一种代理以控制这个对象的访问,也叫做委托模式. 咱们比作游戏,通俗讲代理模式就是,一个主题虚基类派生出两个子类,一个玩家类,实现相关操作,一个是代练类,代替执行玩家相关操作,代练类 ...

  6. 设计模式之“代理模式”

    代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用. 代理模式的英文叫做Proxy或Surrogate,中文都可译成"代理".所谓代理,就是一个人或者一 ...

  7. 设计模式之代理模式(Proxy)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  8. snmpd 子代理模式编译测试

    1.参考链接 1)Net-snmp添加子代理示例 https://blog.csdn.net/eyf0917/article/details/39546651 2.操作步骤 1)网络拷贝下面的文件 h ...

  9. 大话设计模式读书笔记--4.代理模式

    生活中的例子: 班主任让班长通知班委下午3点开会 班长就是班主任的代理 代理模式的目的是: 隐藏真实访问对象,同时可以处理别的事情 定义 代理模式:为其他对象提供一种代理以控制对这个对象的访问 也就是 ...

最新文章

  1. Squid代理服务器(二)
  2. Fiddler抓包使用教程-基本功能介绍
  3. 【转载】C/C++语言分析 每年学一种编程语言 git历史
  4. 即时大数据流处理=即时风暴
  5. Netty工作笔记0082---TCP粘包拆包实例演示
  6. PyTorch学习笔记(五):模型定义、修改、保存
  7. php微信开发计数,总结一个微信开发的过程实例
  8. matlab语音信号处理/滤波器降噪/时域频域、归一化图谱
  9. 本地的手机号码归属地查询-oracle数据
  10. aardio - 巧用字符分隔符\u0001
  11. 吉林警方重击涉黑涉恶犯罪 一年打掉439个团伙
  12. leetcode感想
  13. c语言用pow求x的y次幂,使用系统函数pow(x,y)计算x的y次方的值,注意包含头文件math.h...
  14. 华为会议终端TE10 SIP配置范例
  15. android电量百分比,Android P 状态栏显示电量百分比
  16. 第五届“强网”拟态防御国际精英挑战赛——特邀战队篇
  17. cef ocx 支持_Cef3/Chromium的编译和音视频支持的修改
  18. Android : 破解apk
  19. ESP32C3驱动舵机
  20. ComponentOne C1ReportDesigner 设计报表

热门文章

  1. u盘检测工具哪个好用_惠普打印机哪个型号好 惠普打印机型号介绍【推荐】
  2. havc是什么意思_avc是什么意?eduis里h.264/a – 手机爱问
  3. html语言中的链接方式,什么是超链接_在html中设置超链接的方法 - 驱动管家
  4. aop java 接口_Spring AOP实现接口验签
  5. php中怎么让图片没有缓存,关于项目中图片缓存的问题
  6. 全民超神服务器维护,全民超神更新维护公告 更新内容详细一览
  7. oracle 左连接 权限,Oracle 左连接、右连接、全外连接、(+)号作用
  8. python3内置函数_python3--内置函数
  9. NYOJ-邮票分你一半(dp)
  10. 图像算法五:【图像小波变换】多分辨率重构、Gabor滤波器、Haar小波