这样来理解委托,代理,协议三者的区别
一、什么是委托
刚接触iOS开发的朋友肯定对委托这个东西感觉到陌生和迷惑,特别是Java转过来的(博主中枪),那么今天我们就简单的谈谈委托这个东西,atany会尽量做到说的浅显易懂的~
首先让我们来看看委托的定义:委托(delegate),就是某个对象指定另一个对象处理某些特定任务的设计模式。通俗来说,就是“某个对象”把要做的事情委托给“另一个对象”去做,简单吧。
其中“某个对象”被称作委托者,“另一个对象”被称作是被委托者。
【注】:委托者与被委托者的叫法很多,例如(普通对象与委托对象,委托与代理等等)为了方便大家理解,下文统一使用“委托与代理”的叫法。
在委托与代理之间还有一个重要的概念——协议,协议是委托与代理之间的桥梁,把两者紧密联系在一起。
二、委托与代理
如下图,委托方通过某种方式把任务分派出去给代理方处理,而两者之间的联系便是协议。
在程序中:一般情况下
1.委托需要做的工作有:
1.1定义协议与方法
1.2声明委托变量
1.3设置代理
1.4通过委托变量调用委托方法
2.代理需要做的工作有:
2.1遵循协议
2.2实现委托方法
可能现在大家还不明白,我们设置如下场景,把每个工作都带入代码就清楚了
场景:Boss准备举行一场party,准备邀请Atany来参加party,但是Boss没空写email给Atany,于是他委托Henry与Mary来做这件事情。
1) 先看YGViewController.h(根控制器,程序第一个界面,类似于Boss)
- #import <UIKit/UIKit.h>
- @protocol InviteDelegate
- -(void)inviteToMyParty:(NSString *)personName;//1.1定义协议与方法
- @end
- @interface YGViewController : UIViewController
- @property (assign,nonatomic) id<InviteDelegate> delegate;//1.2声明委托变量
- - (IBAction)ClickByMary:(id)sender;//委托给Mary
- - (IBAction)ClickByHenry:(id)sender;//委托给Henry
- @end
在YGViewController.h中,委托执行了两件事情,分别是定义协议与声明委托。Boss并没有实现inviteToMyParty这个方法,他没有自己去邀请。
2) 再看YGViewController.m中ClickByMary与ClickByHenry点击事件
- - (IBAction)ClickByMary:(id)sender {
- Mary *mary = [[Mary alloc]init];
- self.delegate = mary;//1.3设置代理
- [self.delegate inviteToMyParty:@"atany"];//1.4通过委托变量调用委托方法
- }
- - (IBAction)ClickByHenry:(id)sender {
- Henry *henry = [[Henry alloc]init];
- self.delegate = henry;//1.3设置代理
- [self.delegate inviteToMyParty:@"atany"];//1.4通过委托变量调用委托方法
- }
两者大同小异,都是实例化对象,然后设置代理,最后调用方法。
BOSS可以选择不同的代理(Henry与Mary)来做这件事情(inviteToMyParty),而自己却不用做。
3) 以Henry为例子,我们看看Henry.h
- #import <UIKit/UIKit.h>
- #import "YGViewController.h"
- @interface Henry : UIViewController <InviteDelegate>//2.1遵循协议
- @end
Henry遵循协议,随时准备好接收Boss的召唤。
4) Henry.m中我们实现了inviteToMyParty的具体方法,我们弹出一个对话框来显示邀请内容。
- -(void)inviteToMyParty:(NSString *)personName{
- NSString *hello = [NSString stringWithFormat:@"Hello,%@",personName];
- NSString *str = [NSString stringWithFormat:@"Hey Boy,this is Henry,Come to our party Please!!"];
- UIAlertView *alert = [[UIAlertView alloc]initWithTitle:hello message:str delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
- [alert show];
- }
按照上面步骤便完成一个简单的协议+委托的程序。
效果图:
这样来理解委托,代理,协议三者的区别相关推荐
- 设计模式——策略模式,工厂模式,代理模式三者的区别
工厂模式主要是返回的接口实现类的实例化对象,最后返回的结果是接口实现类中的方法,而策略模式是在实例化策略模式的时候已经创建好了,我们可以再策略模式中随意的拼接重写方法,而工厂模式是不管方法的拼接这些的 ...
- 【详细】【转】C#中理解委托和事件 事件的本质其实就是委托 RabbitMQ英汉互翼(一),RabbitMQ, RabbitMQ教程, RabbitMQ入门...
[详细][转]C#中理解委托和事件 文章是很基础,但很实用,看了这篇文章,让我一下回到了2016年刚刚学委托的时候,故转之! 1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C ...
- 北风设计模式课程---深入理解[代理模式]原理与技术
北风设计模式课程---深入理解[代理模式]原理与技术 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装 ...
- 把委托说透(2):深入理解委托
在上一篇随笔中我们通过示例逐步引入了委托,并比较了委托和接口.本文将重点剖析委托的实质. 委托在本质上仍然是一个类,我们用delegate关键字声明的所有委托都继承自System.MulticastD ...
- IOS 委托和协议区别和联系 (-)
2019独角兽企业重金招聘Python工程师标准>>> IOS 委托和协议区别和联系 (-) IOS上的协议类似于C#.Java上面的接口,他是从类中抽出来的一系列方法,但方法的实现 ...
- C#委托的定义 以及使用方式详解,更简单的理解委托。
委托的声明及定义: 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得 ...
- 理解面向连接和无连接协议之间的区别
理解面向连接和无连接协议之间的区别 网络编程中最基本的概念就是面向连接(connection-oriented)和无连接(connectionless)协议. 面向连接和无连接指 ...
- 深入理解TCP/IP协议-TCP建立与终止连接
转载自 深入理解TCP/IP协议-TCP建立与终止连接 一.引言 TCP 是一个面向连接的协议.无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.连接创建与终止的状态变化图如下: ...
- 彻底理解正向代理和反向代理
转载自 彻底理解正向代理和反向代理 平时工作中我们会接触到各种代理,它到底是什么概念呢,又是什么工作原理,下面我们具体来分析一下. 1.概念 正向代理 这个很好理解,比如说你现在要访问一个外国的社交网 ...
- 详解Objective-C中委托和协议
Objective-C委托和协议本没有任何关系,协议如前所述,就是起到C++中纯虚类的作用,对于"委托"则和协议没有关系,只是我们经常利用协议还实现委托的机制,其实不用协议也完全可 ...
最新文章
- 使用Nginx搭建前端静态服务器+文件服务器
- Coefficients: (1 not defined because of singularities)
- photo.php,EasyPhoto.php
- 修改otrs notification master邮件通知地址和名称
- 奔跑吧,OpenStack现场分享:超融合架构如何抹平物理硬件差异?
- 计算机与技术卓越信息技术,2018版计算机科学与技术专业(卓越工程师)培养目标与毕业要求...
- 【机器视觉学习笔记】最近邻插值实现图片任意角度旋转(C++)
- oracle如何检查是否rac,Oracle RAC 状态检查
- 在每个运行中运行多个查询_Spring Data JPA的运行原理及几种查询方式
- Java输出小明算对多少题目_2014年Java方向C组第十题
- java_web用户的自动登录模块的实现
- PCS7安装时提示please insert the following CD-ROM: SIMTIC PCS7 V?.? SP1 DVD 2/2
- android json 转map,json字符串转map
- yuv420转yuv422(yuyv)
- MTK刷机(ubuntu下)
- 如何在html中插入表情包,一款支持插入表情的编辑器实现代码(简单思路挺重要)...
- 今天不写技术文章,摘一篇好文,呵呵(95%中国民营企业家富不过三代 子女教育存失误)
- mysql 表名 下划线_我们可以在MySQL表名中加下划线吗?
- jQueryUI皮肤下载、jQgrid中更换皮肤
- SQL查询学生表中每课大于85分的同学名称
热门文章
- 数据分析师工资高达50万,正在进入每一个行业!
- 《Qt 实战一二三》
- win10计算机不分区,win10有必要分区吗
- Computer composition and design work04 ——fifth verson
- 用RePKG解包.pkg文件【Wallpaper Engine】
- LightOJ 1336. Sigma Function
- 逃离996的年轻人却难逃租房的“坑”
- 数据挖掘 文本分类(二)搜集中文语料库与ICTCLAS分词
- Java快排两种写法
- input 输入框中文,监听的input事件 屏蔽拼音状态