OC中的代理模式
这里举一个简单的例子:
小孩类,护士类,保姆类,其中小孩类有两个方法:wash和play
这里代理对象就是:护士类、保姆类,小孩类是被代理对象。
看一下代码:
首先看一下小孩类:
Children.h
[objc] view plaincopy
1. //
2. // Children.h
3. // 12_DesignStyle
4. //
5. // Created by jiangwei on 14-10-11.
6. // Copyright (c) 2014年 jiangwei. All rights reserved.
7. //
8.
9. #import <Foundation/Foundation.h>
10.
11. @class Children;//如果没有这行代码的话,协议ChildrenDelegate中得Children类型就会查找不到,报错
12.
13. @protocol ChildrenDelegate <NSObject>
14.
15. @required
16. - (void)wash:(Children *)children;
17. - (void)play:(Children *)children;
18.
19. @end
20.
21. @interface Children : NSObject{
22.
23. //Nure *_nure;//保姆
24. //这里可以使用多态技术实现,因为保姆,护士有共同的父类NSObject,但是这里不使用这种方式,而是使用id类型
25. //但是我们还需要为这个类型添加一些方法,这里就用到了协议
26. //这个代理对象必须遵从ChildrenDelegate协议
27. id<ChildrenDelegate> _delegate;//这个变量就是小孩的代理对象
28. NSInteger timeValue;
29. }
30.
31. -(void)setDelegate:(id)delegate;
32.
33. @end
这里,我们定义了一个协议:ChildrenDelegate,他有两个必要的方法:wash和play
我们还定义了一个很重要的属性
_delegate
这个属性定义有点不一样,这个就是实现代理对象的精髓所在了,id是不确定类型,所以这个_delegate变量可以被赋值为的类型是:
只要实现了ChildrenDelegate协议的类就可以了。这里就记住了,以后这种定义方法后面会用到很多。相当于Java中的接口类型,只能赋值其实现类的类型。只是这里的定义格式为:id<协议名>
然后就是一个设置协议的方法了,注意参数类型也必须是id的
其实这里面也牵涉到了之前说到的多态特性,所以说代理模式也是建立在多态的特性上的。
Children.m
[objc] view plaincopy
1. //
2. // Children.m
3. // 12_DesignStyle
4. //
5. // Created by jiangwei on 14-10-11.
6. // Copyright (c) 2014年 jiangwei. All rights reserved.
7. //
8.
9. #import "Children.h"
10.
11. //这里用到了保姆的一些动作
12. //假如现在想请一个护士,那么我们又要去从新去请一个护士,那么这里面代码需要改,把保姆的地方换成护士的地方
13. //产生的原因就是因为耦合度太高了,保姆和孩子耦合在一起,如果需要换的话,就需要改动代码
14. //
15. @implementation Children
16.
17. - (id)init{
18. self = [super init];
19. if(self != nil){
20. [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
21. }
22. return self;
23. }
24.
25. -(void)setDelegate:(id)delegate{
26. _delegate = delegate;
27. }
28.
29. - (void)timerAction:(NSTimer *)timer{
30. timeValue++;
31. if(timeValue == 5){
32. [_delegate wash:self];
33. }
34. if(timeValue == 10){
35. [_delegate play:self];
36. }
37. }
38.
39. @end
我们自定义了一个初始化方法,在初始化方法中我们做了一个定时器的工作。
[java] view plaincopy
1. [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
这个就是OC中启动一个简单的计时器:每隔1s中就去执行一次self中的timerAction方法。
OC中的定时器和java不一样,他的执行逻辑可以单独的在一个指定的方法中去做(C中的函数指针差不多,只要传递一个函数指针过来,就可以执行指定的函数,所以@selector做的工作就是这个),但是Java中必须实现Runable接口,在run方法中执行指定的逻辑代码。
在timerAction方法中,我们是判断当时间到5s了,就执行代理对象的wash方法,10s的时候执行play方法。
在来看一下护士类:
Nure.h
[objc] view plaincopy
1. //
2. // Nure.h
3. // 12_DesignStyle
4. //
5. // Created by jiangwei on 14-10-11.
6. // Copyright (c) 2014年 jiangwei. All rights reserved.
7. //
8.
9. #import <Foundation/Foundation.h>
10.
11. #import "Children.h"
12.
13. @interface Nure : NSObject<ChildrenDelegate>
14.
15. - (void)wash:(Children *)children;
16. - (void)play:(Children *)children;
17.
18. @end
护士类很简单,实现ChildrenDelegate协议
Nure.m
[objc] view plaincopy
1. //
2. // Nure.m
3. // 12_DesignStyle
4. //
5. // Created by jiangwei on 14-10-11.
6. // Copyright (c) 2014年 jiangwei. All rights reserved.
7. //
8.
9. #import "Nure.h"
10.
11. #import "Children.h"
12.
13. @implementation Nure
14.
15. - (void)wash:(Children *)children{
16. NSLog(@"小孩脏了,保姆帮小孩洗澡");
17. }
18.
19. - (void)play:(Children *)children{
20. NSLog(@"小孩哭了,保姆和小孩玩耍");
21. }
22.
23. @end
在这里就去实现wash和play方法了
在来看一下保姆类:
Nanny.h
[objc] view plaincopy
1. //
2. // Nanny.h
3. // 12_DesignStyle
4. //
5. // Created by jiangwei on 14-10-11.
6. // Copyright (c) 2014年 jiangwei. All rights reserved.
7. //
8.
9. #import <Foundation/Foundation.h>
10.
11. #import "Children.h"
12.
13. @interface Nanny : NSObject<ChildrenDelegate>
14.
15. - (void)wash:(Children *)children;
16. - (void)play:(Children *)children;
17.
18. @end
Nanny.m
[objc] view plaincopy
1. //
2. // Nanny.m
3. // 12_DesignStyle
4. //
5. // Created by jiangwei on 14-10-11.
6. // Copyright (c) 2014年 jiangwei. All rights reserved.
7. //
8.
9. #import "Nanny.h"
10.
11. #import "Children.h"
12.
13. @implementation Nanny
14.
15. - (void)wash:(Children *)children{
16. NSLog(@"小孩脏了,护士帮小孩洗澡");
17. }
18.
19. - (void)play:(Children *)children{
20. NSLog(@"小孩哭了,护士和小孩玩耍");
21. }
22.
23. @end
保姆类和护士类的代码逻辑是一样的,因为他们两个都是实现了一个协议
测试类
main.m
[objc] view plaincopy
1. //
2. // main.m
3. // 12_DesignStyle
4. //
5. // Created by jiangwei on 14-10-11.
6. // Copyright (c) 2014年 jiangwei. All rights reserved.
7. //
8.
9. #import <Foundation/Foundation.h>
10.
11. #import "Children.h"
12. #import "Nure.h"
13. #import "Nanny.h"
14.
15. //核心:id类型+协议
16. //做到低耦合操作
17. //同时也可以做到两个类之间的通信
18.
19. int main(int argc, const charchar * argv[]) {
20. @autoreleasepool {
21. Children *child = [[Children alloc] init];
22.
23. Nure *nure = [[Nure alloc] init];
24. Nanny *nanny= [[Nanny alloc] init];
25.
26. [child setDelegate:nanny];
27. // [child setNure:nure];
28.
29. [[NSRunLoop currentRunLoop] run];
30. }
31. return 0;
32. }
看到了,测试类很简单。我们也发现了,代理模式的好处也是显现出来了,比如现在又来了一个人来照顾孩子:妈妈类,那么我们只要让妈妈类实现那个协议即可。这种耦合度也不会很高。所以代理模式还是超级有用的,而且我们后面在开发IOS的时候,会发现他里面用到的代理模式很多的。
运行结果:
总结
OC中的代理模式的更多相关文章
- 介绍 - OC中的代理模式
一,代理设计模式的场合: 当对象A发生了一些行为,想告知对象B (让对象B成为对象A的代理对象) 对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象) 当对象A无法处理某些行为的时候,想让对 ...
- Objective-C中的委托(代理)模式
我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口 ...
- (转)轻松学,Java 中的代理模式及动态代理
背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...
- 简介Python设计模式中的代理模式与模板方法模式编程
简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...
- 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式
1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...
- Java中的代理模式
代理模式在Java Web的框架中经常使用到.比如说在对数据库的访问中,核心功能是对数据库的增删改查,而连接数据库.处理事务等功能我们在开发中也要考虑到.所以我们将数据库的CRUD抽象到接口中,然后实 ...
- 说说Java中的代理模式
今天看到传智播客李勇老师的JDBC系列的第36节——通过代理模式来保持用户关闭连接的习惯.讲的我彻底蒙蔽了,由于第一次接触代理模式,感到理解很难,在博客园找到一篇文章,先记录如下: 引用自java设计 ...
- 理解Android系统的进程间通信原理(一)----RPC中的代理模式
Android系统中的进程间通信是通过一个轻量级的RPC(Remote Procedure Call远程进程调用)和AIDL(Android Interface Definination Langua ...
- 深入理解JAVA中的代理模式
前言 代理是什么 事故现场:我家的宠物今天生病了,而我又没有相关的医学知识,所以我只让我的宠物多喝热水吗? 结果显然是不行的,所以我需要去找宠物医生这些更专业的人来帮我的宠物治病. 这个时候,代理就出 ...
随机推荐
- OpenCV——PS 图层混合算法(一)
详细的算法原理能够參考 PS图层混合算法之中的一个(不透明度,正片叠底,颜色加深,颜色减淡) // PS_Algorithm.h #ifndef PS_ALGORITHM_H_INCLUDED #de ...
- DevExpress VCL 2014.1.2 for C++BUILDER XE6
DevExpress VCL 2014.1.2 for C++BUILDER XE6 1)下载 DevExpress VCL 2014.1.2下载链接:http://pan.baidu.com ...
- 响应式流布局插件DyLay
jQuery插件-Dylay,流布局我们前面介绍过很多,但这个流布局jQuery插件不同的是它的动画效果很不错,大家可以尝试使用下.另外<有用的jQuery布局插件推荐>这篇文章中有好几个 ...
- css3 transiton
div { width:100px; height:100px; background:yellow; transition-property:width; transition-duration:1 ...
- Android开发环境的搭建之(三)虚拟设备AVD的创建
选择AVD Manager选项,启动创建AVD向导.根据开发要求创建制定配置的虚拟设备. 设置屏幕大小为17寸,480X800 设置系统映像为API17,X86. 设置AVD Name为MyPhone ...
- MySQL的联结(Join)语法
MySQL的联结(Join)语法 1.内联结.外联结.左联结.右联结的含义及区别: 在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如 ...
- 用python开发简单ftp程序
根据alex老师视频开发的简单ftp程序,只能实现简单的get功能 ftp客户端程序: #!/usr/bin/env python #_*_ coding:utf-8 _*_ import socke ...
- matplotlib中使用imshow绘制二维图
#coding:utf-8 from matplotlib import mpl import matplotlib.pyplot as plt#载入matplotlib快速绘图的函数库 import ...
- python 通过ntlm验证下载文件
最近使用python实现一个小工具,需要从网站下载文件,下载时服务端需要进行ntlm验证,否则返回401错误响应.经研究 requests库配合 requests-ntlm 可以解决这个问题. ntl ...
- Python urllib和urllib2模块学习(一)
(参考资料:现代魔法学院 http://www.nowamagic.net/academy/detail/1302803) Python标准库中有许多实用的工具类,但是在具体使用时,标准库文档上对使用 ...