何实现代理模式的。

这里举一个简单的例子:

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

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

看一下代码:

首先看一下小孩类:

Children.h

  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. #import <Foundation/Foundation.h>
  9. @class Children;//如果没有这行代码的话,协议ChildrenDelegate中得Children类型就会查找不到,报错
  10. @protocol ChildrenDelegate <NSObject>
  11. @required
  12. - (void)wash:(Children *)children;
  13. - (void)play:(Children *)children;
  14. @end
  15. @interface Children : NSObject{
  16. //Nure *_nure;//保姆
  17. //这里可以使用多态技术实现,因为保姆,护士有共同的父类NSObject,但是这里不使用这种方式,而是使用id类型
  18. //但是我们还需要为这个类型添加一些方法,这里就用到了协议
  19. //这个代理对象必须遵从ChildrenDelegate协议
  20. id<ChildrenDelegate> _delegate;//这个变量就是小孩的代理对象
  21. NSInteger timeValue;
  22. }
  23. -(void)setDelegate:(id)delegate;
  24. @end

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

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

_delegate

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

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

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

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

Children.m

  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. #import "Children.h"
  9. //这里用到了保姆的一些动作
  10. //假如现在想请一个护士,那么我们又要去从新去请一个护士,那么这里面代码需要改,把保姆的地方换成护士的地方
  11. //产生的原因就是因为耦合度太高了,保姆和孩子耦合在一起,如果需要换的话,就需要改动代码
  12. //
  13. @implementation Children
  14. - (id)init{
  15. self = [super init];
  16. if(self != nil){
  17. [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
  18. }
  19. return self;
  20. }
  21. -(void)setDelegate:(id)delegate{
  22. _delegate = delegate;
  23. }
  24. - (void)timerAction:(NSTimer *)timer{
  25. timeValue++;
  26. if(timeValue == 5){
  27. [_delegate wash:self];
  28. }
  29. if(timeValue == 10){
  30. [_delegate play:self];
  31. }
  32. }
  33. @end

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

  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

  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. #import <Foundation/Foundation.h>
  9. #import "Children.h"
  10. @interface Nure : NSObject<ChildrenDelegate>
  11. - (void)wash:(Children *)children;
  12. - (void)play:(Children *)children;
  13. @end

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

Nure.m

  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. #import "Nure.h"
  9. #import "Children.h"
  10. @implementation Nure
  11. - (void)wash:(Children *)children{
  12. NSLog(@"小孩脏了,保姆帮小孩洗澡");
  13. }
  14. - (void)play:(Children *)children{
  15. NSLog(@"小孩哭了,保姆和小孩玩耍");
  16. }
  17. @end

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

在来看一下保姆类:

Nanny.h

  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. #import <Foundation/Foundation.h>
  9. #import "Children.h"
  10. @interface Nanny : NSObject<ChildrenDelegate>
  11. - (void)wash:(Children *)children;
  12. - (void)play:(Children *)children;
  13. @end

Nanny.m

  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. #import "Nanny.h"
  9. #import "Children.h"
  10. @implementation Nanny
  11. - (void)wash:(Children *)children{
  12. NSLog(@"小孩脏了,护士帮小孩洗澡");
  13. }
  14. - (void)play:(Children *)children{
  15. NSLog(@"小孩哭了,护士和小孩玩耍");
  16. }
  17. @end

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

测试类

main.m

  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. #import <Foundation/Foundation.h>
  9. #import "Children.h"
  10. #import "Nure.h"
  11. #import "Nanny.h"
  12. //核心:id类型+协议
  13. //做到低耦合操作
  14. //同时也可以做到两个类之间的通信
  15. int main(int argc, const charchar * argv[]) {
  16. @autoreleasepool {
  17. Children *child = [[Children alloc] init];
  18. Nure *nure = [[Nure alloc] init];
  19. Nanny *nanny= [[Nanny alloc] init];
  20. [child setDelegate:nanny];
  21. //      [child setNure:nure];
  22. [[NSRunLoop currentRunLoop] run];
  23. }
  24. return 0;
  25. }

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

运行结果:

OC学习篇之---代理模式的更多相关文章

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

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

  2. oc学习之路----代理模式

    今天刚学完oc的代理模式,觉得有点新奇,第一次接触,原理 A完成一件事,但是自己不能完成,于是他找个代理人B 替他完成这个事情,他们之间便有个协议 (protocol),B继承该协议来完成A代理给他的 ...

  3. oc学习之路----代理模式2-使用步骤

    之前已经写过一个个人关于代理模式的一些看法,现在就来总结一下使用代理模式的步骤吧. 1.先搞清楚谁是谁的代理(delegate) ● 2.定义代理协议,协议名称的命名规范:控件类名 + Delegat ...

  4. OC学习篇之---总结和学习目录

    今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...

  5. OC学习篇之---单例模式

    在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单 ...

  6. (转载)OC学习篇之---Foundation框架中的NSObject对象

    前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套a ...

  7. JAVA学习篇--静态代理VS动态代理

    本篇博客的由来,之前我们学习大话设计,就了解了代理模式,但为什么还要说呢? 原因: 1,通过DRP这个项目,了解到了动态代理,认识到我们之前一直使用的都是静态代理,那么动态代理又有什么好处呢?它们二者 ...

  8. (转载)OC学习篇之---概述

    前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲 ...

  9. 黑马程序猿_ 利用oc的协议实现代理模式

    先说下代理模式是什么吧 定义: 为其它对象提供一种代理以控制对这个对象的訪问.在某些情况下,一个对象不适合或者不能直接引用还有一个对象 而代理对象能够在client和目标对象之间起到中介的作用. 在看 ...

随机推荐

  1. windows下git hub的GUI软件配置与使用

    转载自:http://www.cnblogs.com/haore147/p/3618930.html   1. 安装两个软件 1 2 1. git的命令行程序--git for windows:htt ...

  2. Drools 7.4.1.Final参考手册(十四)集成Spring

    集成Spring Drools 6.0重要变更 Drools Spring集成经历了与Drools 6.0的变化完全一致的改造. 以下是一些主要的变化: T*推荐的Drools Spring的前缀已经 ...

  3. BZOJ 3998 TJOI2015 弦论 后缀自动机+DAG上的dp

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3998 题意概述:对于一个给定长度为N的字符串,求它的第K小子串是什么,T为0则表示不同位置 ...

  4. 对TDD的实践感悟

    文章:我的TDD实践:可测试性驱动开发(上) 文章表达的思想是,达到一个目的并非只有一种套路,作者用写代码时,时刻考虑代码的可测试性,来推动项目的合理开发.

  5. java面向对象课程设计-数学表达式计算器

    项目简介 设计一个计算器,其能够: 1)由用户输入一个简单的四则运算表达式,求出其计算结果后显示. 2)特殊数学函数,如:绝对值.取整.三角函数.倒数.平方根.平方.立方等. 3)对一定范围内的数字将 ...

  6. lintcode-136-分割回文串

    136-分割回文串 给定一个字符串s,将s分割成一些子串,使每个子串都是回文串. 返回s所有可能的回文串分割方案. 样例 给出 s = "aab",返回 [ ["aa&q ...

  7. fork开源代码后如何基于某个tag建立自己的branch

    应用场景: 在github上fork一个自己想看的开源项目,想基于某个tag来写一些测试demo,然后可以做到版本控制. 方法: //克隆 git clone xxxxx.git //查看tag gi ...

  8. 安装和配置hadoop集群步骤

    hadoop集群的安装步骤和配置 hadoop是由java语言编写的,首先我们肯定要在电脑中安装jdk,配置好jdk的环境,接下来就是安装hadoop集群的步骤了,在安装之前需要创建hadoop用户组 ...

  9. Luogu3953 NOIP2017逛公园(最短路+拓扑排序+动态规划)

    跑一遍dij根据最短路DAG进行拓扑排序,按拓扑序dp即可.wa了三发感觉非常凉. #include<iostream> #include<cstdio> #include&l ...

  10. JAVA 异常处理的认知学习过程

    没有异常处理 学生时代,我编写的java代码中,很少会有try catch.最主要的原因如下: 应用的规模很小 没有不确定因素 代码可控性高 如果规模小,往往就没有复杂的逻辑链路,整个软件的分层也很浅 ...