OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍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中的代理模式核心技术是:id类型+协议+多态

OC中的代理模式的更多相关文章

  1. 介绍 - OC中的代理模式

    一,代理设计模式的场合: 当对象A发生了一些行为,想告知对象B (让对象B成为对象A的代理对象) 对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象) 当对象A无法处理某些行为的时候,想让对 ...

  2. Objective-C中的委托(代理)模式

    我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口 ...

  3. (转)轻松学,Java 中的代理模式及动态代理

    背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...

  4. 简介Python设计模式中的代理模式与模板方法模式编程

    简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...

  5. 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...

  6. Java中的代理模式

    代理模式在Java Web的框架中经常使用到.比如说在对数据库的访问中,核心功能是对数据库的增删改查,而连接数据库.处理事务等功能我们在开发中也要考虑到.所以我们将数据库的CRUD抽象到接口中,然后实 ...

  7. 说说Java中的代理模式

    今天看到传智播客李勇老师的JDBC系列的第36节——通过代理模式来保持用户关闭连接的习惯.讲的我彻底蒙蔽了,由于第一次接触代理模式,感到理解很难,在博客园找到一篇文章,先记录如下: 引用自java设计 ...

  8. 理解Android系统的进程间通信原理(一)----RPC中的代理模式

    Android系统中的进程间通信是通过一个轻量级的RPC(Remote Procedure Call远程进程调用)和AIDL(Android Interface Definination Langua ...

  9. 深入理解JAVA中的代理模式

    前言 代理是什么 事故现场:我家的宠物今天生病了,而我又没有相关的医学知识,所以我只让我的宠物多喝热水吗? 结果显然是不行的,所以我需要去找宠物医生这些更专业的人来帮我的宠物治病. 这个时候,代理就出 ...

随机推荐

  1. linux系统关机与重新启动命令

    在linux下关机和重新启动系统有shutdown.halt.reboot.init,对于他们来说他们的内部工作过程是不同样的. 1.shutdown命令 使用它能够安全地关闭系统.然而在关闭系统时. ...

  2. MVC模式下My97DatePicker日期控件引用注意事项

    My97DatePicker日期控件之前在用webform模式开发的时候,只要 <script language="javascript" type="text/j ...

  3. Hibernate征途(一)之初识

    相见恨晚 很久以前,大概从开始接触数据库开始,就闪过这样一个想法,怎么看怎么觉得数据库表和vb的类模块很像,不是么?除了vb类模块还有函数外:越往下学觉得二者越像,尤其在三层时学到实体类的概念,我去, ...

  4. 十分钟让你明白Objective-C的语法(和Java、C++的对比)

    很多想开发iOS,或者正在开发iOS的程序员以前都做过Java或者C++,当第一次看到Objective-C的代码时都会头 疼,Objective-C的代码在语法上和Java, C++有着很大的区别, ...

  5. 好用的DNS服务器推荐

    DNS在平时上网中扮演重要角色,如果不注意DNS的话,可能会导致网速慢.弹窗广告.网址打不开.打开不是自己想要的网站.淘宝客劫持等一系列问题.针对DNS的问题,网络上也有各种DNS平台供用户选择.这里 ...

  6. mysql的面试试题

    1, mysql的复制原理以及流程. (1)先问基本原理流程,3个线程以及之间的关联. 答:Mysql复制的三个线程:主库线程,从库I/O线程,从库sql线程: 复制流程:(1)I/O线程向主库发出请 ...

  7. Genymotion error:The virtual device got no IP address

    控制面板,网络和intent,网络和共享中心,更改适配器设置,看下你的VirtualBox Host-Only Ethernet Adapter这个显卡 启动了没有, 没有就启动它!!!

  8. SQL Server中调用WebService的实例

    尊重原著作:本文转载自http://www.cnblogs.com/icycore/p/3532197.html 1.Ole Automation Procedures 服务器配置选项 当启用 OLE ...

  9. struts2.3.15.3中动态方法调用默认是关闭的

    初学ssh,用的struts2.3.15.3,使用了如下表单: <form action="/spring3/index/login.action" method=" ...

  10. Java的常见误区与细节

    网上转来的 昨天整整一天,我都都呆在图书里.本打算找一些书学习“正则表达式”,很失望,没找到有这部分的内容的书.发现了一本<Java深入解析>,其中涉及了很多平时没有注意的一些误区,也许开 ...