黑马程序猿_ 利用oc的协议实现代理模式
先说下代理模式是什么吧
定义: 为其它对象提供一种代理以控制对这个对象的訪问。在某些情况下,一个对象不适合或者不能直接引用还有一个对象
而代理对象能够在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的协议实现代理模式的更多相关文章
- 黑马程序猿_Objective C 类与协议
<a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>.& ...
- 黑马程序猿_Java 代理机制学习总结
-------<a href="http://www.itheima.com/"">android培训</a>.<a href=" ...
- 大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17
黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\ 大数据 目 ...
- 黑马程序猿————Java基础日常笔记---反射与正則表達式
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...
- 黑马程序猿——25,打印流,合并流,对象序列化,管道流,RandomAccessFile
------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...
- 2016年8月17日 内省(1)18_黑马程序员_使用beanUtils操纵javabean
8.内省(1):18_黑马程序员_使用beanUtils操纵javabean 1.导入两个包: 2.调用静态方法. 9.泛型 map.entrySet() :取出map集合的键值对组成一个set集合. ...
- 黑马程序猿——15,String,StringBuffer,基本数据类型包装对象
------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...
- (转载)OC学习篇之---代理模式
在前一篇文章我们介绍了OC中的协议的概念,这篇文章我们就来介绍一下OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍OC中是如何实现代理模式的. ...
- 黑马程序员_ Objective-c 概述及面向对象与三大特性
-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ (一).语法概述 1. oc介绍:(.m文件) 1> c语言的基础上,增加 ...
随机推荐
- attachEvent和addEventListener详解
attachEvent方法可以动态的为网页内的元素添加一个事件.通常你想为某个按扭添加一个单击事件时.你都会在按扭内写上onclick=事件名称.使用attachEvent则不必这样做.你把写好的事件 ...
- C++操作符的优先级
C++操作符的优先级 C++操作符的优先级 操作符及其结合性 功能 用法 L L L :: :: :: 全局作用域 类作用域 名字空间作用域 ::name class::name namespace: ...
- 【Android开源项目分析】android轻量级开源缓存框架——ASimpleCache(ACache)源代码分析
转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46379055 ASimpleCache框架源代码链接 https://github ...
- vs2010中将复制过来的文件或文件夹显示到解决方案管理
今天在给一个做好的页面上加.net程序,我先将程序中的文件夹复制到解决方案中,可是在VS2010的解决方案资源管理器中并没有这样的文件夹,可明明 在这里,为什么显示不出来,应该在VS2010的哪个地方 ...
- <转载>Div+Css布局教程(-)CSS必备知识
目录: 1.Div+Css布局教程(-)CSS必备知识 注:本教程要求对html和css有基础了解. 一.CSS布局属性 Width:设置对象的宽度(width:45px). Height:设置对象的 ...
- Qt之界面出现、消失动画效果
在学习Qt的这2.3个月里,对Qt越发感兴趣,从刚开始的盲目.无所适从到现在的学习.研究.熟练.掌握的过程中,我学到了很多东西,也学会了如何通过自学让自己更加成熟.强大起来,如何更有效地提高自己学习. ...
- Delphi中MethodAddress汇编代码的解析
class function TObject.MethodAddress(const Name: ShortString): Pointer;asm { -> EAX ...
- linux中怎样设置dhcpd
linux中怎样设置DHCP 在 linux 以下设置 DHCP一点也不复杂﹐您全部要做的仅仅有一个文件﹕/etc/dhcpd.conf . 以下﹐我用我自己的设置文件来说说怎么改动这个文件﹕ d ...
- Appium TestNg Maven Android Eclipse java简单启动实例
环境准备 Eclipse + maven + appium + TestNg 确保已经在Eclipse 上面安装maven TestNg的插件 打开Eclipse,新建一个java项目,把项目转换成m ...
- Windows的自带控件(比如TButton)大多数消息都由它自己处理,Delphi覆盖了那么多WM_函数优先级较低,一般用不上
在空窗体上放一个TButton,一个TPanel,然后把在TWinControl.WMEraseBkgnd里下断点: procedure TWinControl.WMEraseBkgnd(var Me ...