先说下代理模式是什么吧

定义: 为其它对象提供一种代理以控制对这个对象的訪问。在某些情况下,一个对象不适合或者不能直接引用还有一个对象

而代理对象能够在client和目标对象之间起到中介的作用。

在看过李明杰老师的课程后,我对代理模式有了最初步的理解,尽管还非常浅显 可是也明确了代理模式的

一些作用跟使用方法。首先使用代理模式能够减少耦合度。

大大的增强了代码的弹性。

举个样例,小明想看电影。可是没时间买票 于是就拜托小强去买票

最简单的方式就是 建立一个person类(小明) 一个agent类(代理类)

agent类 帮person去买票或者问票价 而且返回消息 给person

这种话person仅仅须要 调用 agent就能够获得自己想要的消息 很方便

可是 , 代理并不仅仅是有一个 当person想换还有一个代理的时候 就须要换成还有一个代理 nextagent

非常明显 这样会非常麻烦 于是我们想到了 使用万能指针 id类型。 这样就能够不用每次都改变代码

可是这样做就会出另外的问题,使用id声明 一个代表着代理的变量时  系统是不“认识”它的 由于

这属于 执行期的多态  在编译期无法识别 代理类 nextagent中 的方法。

所以我们须要一个更灵活 低耦合的模式

利用 协议 ,我们能够把协议当做一个 “用户”与 “代理”之间的中转站

下面是这个样例的协议

@protocol TicketDelegate <NSObject>

//票价
- (double) ticketPrice; //剩了多少张票
- (int) leftTicketNumber; @end

让代理类遵守协议 而且实现应该实现的方法

@interface Agent : NSObject <TicketDelegate>

@end

这样我们就有了 一个能够代理协议 跟一个代理

另外,我们能够通过协议 实现很多其它的代理

@implementation Person

//想看电影
- (void) buyTicket
{
//让代理帮忙买票(询问票价 剩余张数)
double price = [_delegate ticketPrice];
int number = [_delegate leftTicketNumber];
NSLog(@"通过代理知:票价 = %f,剩余票数 = %d",price, number);
} @endl

在person类中 _delegate这个变量代表着 所使用的代理

在上面已经说了要使用id类型 但id类型必需要遵守协议

才干使_delegate 可以使用协议中的方法

这样就攻克了上面所说的无法识别(代理中的方法)的问题

@interface Person : NSObject

- (void) buyTicket;

//拥有一个代理
// 必须遵守协议
@property (nonatomic,retain) id<TicketDelegate> delegate; @end

通过使用协议 person能够使用 很多代理 而且 不须要提前知道这个代理详细是什么  仅仅须要知道它遵守什么协议就好了。

以上就是一个简单的代理 模式 尽管简单 却有着很高的效率 以及 低耦合性

黑马程序猿_ 利用oc的协议实现代理模式的更多相关文章

  1. 黑马程序猿_Objective C 类与协议

    <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>.& ...

  2. 黑马程序猿_Java 代理机制学习总结

    -------<a href="http://www.itheima.com/"">android培训</a>.<a href=" ...

  3. 大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17

    黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\ 大数据 目 ...

  4. 黑马程序猿————Java基础日常笔记---反射与正則表達式

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...

  5. 黑马程序猿——25,打印流,合并流,对象序列化,管道流,RandomAccessFile

    ------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...

  6. 2016年8月17日 内省(1)18_黑马程序员_使用beanUtils操纵javabean

    8.内省(1):18_黑马程序员_使用beanUtils操纵javabean 1.导入两个包: 2.调用静态方法. 9.泛型 map.entrySet() :取出map集合的键值对组成一个set集合. ...

  7. 黑马程序猿——15,String,StringBuffer,基本数据类型包装对象

    ------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...

  8. (转载)OC学习篇之---代理模式

    在前一篇文章我们介绍了OC中的协议的概念,这篇文章我们就来介绍一下OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍OC中是如何实现代理模式的. ...

  9. 黑马程序员_ Objective-c 概述及面向对象与三大特性

    -----------android培训.java培训.java学习型技术博客.期待与您交流!------------ (一).语法概述 1. oc介绍:(.m文件) 1> c语言的基础上,增加 ...

随机推荐

  1. linux卸载不完全

    kali安装一个Nessus,但是在加载插件时候断网了,插件没下载完,后面打开也无法下载插件于是果断卸载了重装,但是无法删除配置文件,恼火了一天 完全卸载软件命令 sudo apt-get --pur ...

  2. <1> perl概述

    [root@wx03 1]# cat a1.pl $arr=[1,2,3,4,5,6]; print $arr->[4]."\n"; $hash={a=>1,b=> ...

  3. .net面试题大全(有答案)

    在网上找来的,希望对大家有所帮助.     1 (1)面向对象的语言具有__继承性_性._封装性_性._多态性 性. (2)能用foreach遍历访问的对象需要实现 _ IEnumerable 接口或 ...

  4. KMP原理、分析及C语言实现

    (是在matrix67博客基础上整理而来,整理着:华科小涛@http://www.cnblogs.com/hust-ghtao/) 有些算法可以让人发疯,KMP算法就是一个.在网上找了很多资料讲的都让 ...

  5. HTTP实现长连接(TTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持Connection: keep-alive)

    HTTP实现长连接 HTTP是无状态的 也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接.如果客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web ...

  6. DELPHI XE7 新的并行库

    DELPHI XE7 的新功能列表里面增加了并行库System.Threading, System.SyncObjs. 为什么要增加新的并行库? 还是为了跨平台.以前要并行编程只能从TThread类继 ...

  7. asp.net检查验证字符串是否为纯数字方法小结

    原文  asp.net检查验证字符串是否为纯数字方法小结 在asp.net中验证字符串是不是为数字我们没有像php中那么多丰富的函数来直接使用,这里我整理了一些比较实例的验证字符串是否为纯数字方法代码 ...

  8. 中文分词算法之最大正向匹配算法(Python版)

    最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的. 正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配. 首先我们可以规定一个词的最大长度,每次扫描的时候 ...

  9. Swift - 继承UIView实现自定义可视化组件(附记分牌样例)

    在iOS开发中,如果创建一个自定义的组件通常可以通过继承UIView来实现.下面以一个记分牌组件为例,演示了组件的创建和使用,以及枚举.协议等相关知识的学习. 效果图如下:    组件代码:Score ...

  10. 移动App-UI配制篇

    杂志app-UI配制篇 背景 现在公司有需求是关于杂志app,里面每个页面可能有不同的展现方式,不同的内容,不同的操作方式.那么这里就有一个需求就是根据用户定制这些不同的展现方式,不同的内容,不同的操 ...