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

这里举一个简单的例子:

小孩类,护士类,保姆类,其中小孩类有两个方法:wash和play

这里代理对象就是:护士类、保姆类,小孩类是被代理对象。

看一下代码:

首先看一下小孩类:

Children.h

//
//  Children.h
//  12_DesignStyle
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//#import <Foundation/Foundation.h>@class Children;//如果没有这行代码的话,协议ChildrenDelegate中得Children类型就会查找不到,报错@protocol ChildrenDelegate <NSObject>@required
- (void)wash:(Children *)children;
- (void)play:(Children *)children;@end@interface Children : NSObject{//Nure *_nure;//保姆//这里可以使用多态技术实现,因为保姆,护士有共同的父类NSObject,但是这里不使用这种方式,而是使用id类型//但是我们还需要为这个类型添加一些方法,这里就用到了协议//这个代理对象必须遵从ChildrenDelegate协议id<ChildrenDelegate> _delegate;//这个变量就是小孩的代理对象NSInteger timeValue;
}-(void)setDelegate:(id)delegate;@end

这里,我们定义了一个协议:ChildrenDelegate,他有两个必要的方法:wash和play

我们还定义了一个很重要的属性

_delegate

这个属性定义有点不一样,这个就是实现代理对象的精髓所在了,id是不确定类型,所以这个_delegate变量可以被赋值为的类型是:

只要实现了ChildrenDelegate协议的类就可以了。这里就记住了,以后这种定义方法后面会用到很多。相当于Java中的接口类型,只能赋值其实现类的类型。只是这里的定义格式为:id<协议名>

然后就是一个设置协议的方法了,注意参数类型也必须是id的

其实这里面也牵涉到了之前说到的多态特性,所以说代理模式也是建立在多态的特性上的。

Children.m

//
//  Children.m
//  12_DesignStyle
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//#import "Children.h"//这里用到了保姆的一些动作
//假如现在想请一个护士,那么我们又要去从新去请一个护士,那么这里面代码需要改,把保姆的地方换成护士的地方
//产生的原因就是因为耦合度太高了,保姆和孩子耦合在一起,如果需要换的话,就需要改动代码
//
@implementation Children- (id)init{self = [super init];if(self != nil){[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];}return self;
}-(void)setDelegate:(id)delegate{_delegate = delegate;
}- (void)timerAction:(NSTimer *)timer{timeValue++;if(timeValue == 5){[_delegate wash:self];}if(timeValue == 10){[_delegate play:self];}
}@end

我们自定义了一个初始化方法,在初始化方法中我们做了一个定时器的工作。

[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

//
//  Nure.h
//  12_DesignStyle
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//#import <Foundation/Foundation.h>#import "Children.h"@interface Nure : NSObject<ChildrenDelegate>- (void)wash:(Children *)children;
- (void)play:(Children *)children;@end

护士类很简单,实现ChildrenDelegate协议

Nure.m

//
//  Nure.m
//  12_DesignStyle
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//#import "Nure.h"#import "Children.h"@implementation Nure- (void)wash:(Children *)children{NSLog(@"小孩脏了,保姆帮小孩洗澡");
}- (void)play:(Children *)children{NSLog(@"小孩哭了,保姆和小孩玩耍");
}@end

在这里就去实现wash和play方法了

在来看一下保姆类:

Nanny.h

//
//  Nanny.h
//  12_DesignStyle
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//#import <Foundation/Foundation.h>#import "Children.h"@interface Nanny : NSObject<ChildrenDelegate>- (void)wash:(Children *)children;
- (void)play:(Children *)children;@end

Nanny.m

//
//  Nanny.m
//  12_DesignStyle
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//#import "Nanny.h"#import "Children.h"@implementation Nanny- (void)wash:(Children *)children{NSLog(@"小孩脏了,护士帮小孩洗澡");
}- (void)play:(Children *)children{NSLog(@"小孩哭了,护士和小孩玩耍");
}@end

保姆类和护士类的代码逻辑是一样的,因为他们两个都是实现了一个协议

测试类

main.m

//
//  main.m
//  12_DesignStyle
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//#import <Foundation/Foundation.h>#import "Children.h"
#import "Nure.h"
#import "Nanny.h"//核心:id类型+协议
//做到低耦合操作
//同时也可以做到两个类之间的通信int main(int argc, const char * argv[]) {@autoreleasepool {Children *child = [[Children alloc] init];Nure *nure = [[Nure alloc] init];Nanny *nanny= [[Nanny alloc] init];[child setDelegate:nanny];
//      [child setNure:nure];[[NSRunLoop currentRunLoop] run];}return 0;
}

看到了,测试类很简单。我们也发现了,代理模式的好处也是显现出来了,比如现在又来了一个人来照顾孩子:妈妈类,那么我们只要让妈妈类实现那个协议即可。这种耦合度也不会很高。所以代理模式还是超级有用的,而且我们后面在开发IOS的时候,会发现他里面用到的代理模式很多的。

运行结果:

总结

这一篇就介绍了OC中如何实现代理模式,其实OC中的代理模式核心技术是:id类型+协议+多态

转载于:https://www.cnblogs.com/roccheung/p/5797303.html

OC学习篇之---代理模式相关推荐

  1. 设计模式学习之1—代理模式

    设计模式学习之1-代理模式 0.?先看这里 --- 诗雨的学习说明 1.从生活中初识代理 2.代理模式的类图和角色 3.静态代理和动态代理 4.静态代理 和 动态代理 的 使用模板 4.1 静态代理使 ...

  2. 23种设计模式学习记录之代理模式

    想说的话: 在大学的时候曾经学过这23种设计模式,但是那时没啥编程经验,糊里糊涂过了一遍,没多久就忘记了,工作之后将精力主要集中在学习新技术上,比如springboot,cloud,docker,vu ...

  3. 设计模式学习笔记之-代理模式

    2019独角兽企业重金招聘Python工程师标准>>>       代理模式中,客户不会直接调用目标对象而是通过一个代码对象,客户调用代理对象代理对象去调用目标对象,起到对象与对象间 ...

  4. 设计模式学习笔记之代理模式

    代理模式 为另一个对象提供一个替身或占位符以控制对这个对象的访问. 使用代理模式创建代表对象,让代表对象控制某个对象的访问,被代理的对象可以是远程的对象.创建开销大的对象或需要安全控制的对象. 在代理 ...

  5. 设计模式学习五、代理模式

    一.什么是代理模式? 为另一个对象提供一个替身或一个占位符以控制对这个对象的访问. 二. 代理模式各种变体. 远程代理:使得客户端可以访问在远程主机的角色(两个程序不在同一个jvm虚拟机). 虚拟代理 ...

  6. 第四篇、代理模式详解(三种)

    一.代理模式 代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用.通俗的来讲代理模式就是我们生活中常见的中介. 二.代理模式的实现方式 1.静态代理 在代理之前,所有 ...

  7. sheng的学习笔记-设计模式-代理模式

    原理图: 代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问.这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. 至少在以下集中情况下可以用 ...

  8. aop学习前奏之代理模式之静态代理

    代理模式这个名字就起的很合适,它所要做的就是"代理"这件事,可以分为静态代理和动态代理. 先说静态代理. 其实我觉得静态代理更像是在不改动原有基础类的原则上进行延伸更多的操作,就像 ...

  9. (转载)OC学习篇之---KVC和KVO操作

    前一篇文章我们介绍了OC中最常用的文件操作,那么今天来看一下OC中的一个比较有特色的知识点:KVC和KVO 一.KVC操作 OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变 ...

最新文章

  1. 垃圾要分类!我们的大脑如何处理垃圾呢?
  2. C#选择目录对话框FolderBrowserDialog
  3. PMP知识点(三、范围管理)
  4. SSH、SSL与HTTPS
  5. spark partition
  6. python中的断言
  7. 「知识蒸馏」最新2022研究综述
  8. 介绍下Javascript原型和原型链的特点?
  9. atitit.bsh BeanShell 的动态脚本使用java
  10. Arp病毒专杀工具下载及其防治解决方案
  11. vue3结合element-plus实现标签手动标注效果
  12. 我的世界如何制作一个空岛服务器,我的世界1.7.10 God 世界空岛服务器
  13. Co-Grounding Networks with Semantic Attention for Referring Expression Comprehension in Videos
  14. 木子-数据库-oracle如何创建一个新的实例
  15. 常用的一些LDO芯片及使用
  16. 支付宝APP支付 (JAVA生成支付信息,uniapp拉起支付宝支付)
  17. iphone 微信网页自动播放音频解决办法
  18. STM32与PC串口通信 实现步进电机转速可调 程序及调试过程分享
  19. 达立易考教育2023年全真模拟考试盛大开考,是骡子是马溜溜
  20. Spring的三种注入方式(为什么推荐构造器注入?)

热门文章

  1. Shift+F5后,vc6不可以退出调试状态,程序不能再次执行
  2. navicat 批量修改列数据
  3. 006_Radio单选框
  4. 026_元素执行函数
  5. php strncmp函数用法,strncmp函数用法详解
  6. 未来之路—写在大二结束之前
  7. 小程序input框letter-spacing失效,处理方法
  8. C语言开发windows桌面程序,开发 windows 桌面软件,现在主流用什么技术?
  9. python小技巧及速度提高-python编码时有什么技巧可以提升速度?
  10. Linux下Nginx编译安装后的开机自启动设置