何实现代理模式的。

这里举一个简单的例子:

小孩类,护士类,保姆类,其中小孩类有两个方法: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. c#执行插入sql 时,报错:异常信息:超时时间已到。在操作完成之前超时时间已过或服务器未响应

    问题:c#执行插入sql 时,报错:异常信息:超时时间已到.在操作完成之前超时时间已过或服务器未响应 解决: SqlCommand cmd = new SqlCommand(); cmd.Comman ...

  2. 官方文档 恢复备份指南六 Configuring the RMAN Environment: Advanced Topics

    RMAN高级设置. 本章内容: Configuring Advanced Channel Options  高级通道选项 Configuring Advanced Backup Options 高级备 ...

  3. UVA 11881 Internal Rate of Return(数学+二分)

    In finance, Internal Rate of Return (IRR) is the discount rate of an investment when NPV equals zero ...

  4. POJ 2162 Document Indexing(模拟)

    Description Andy is fond of old computers. He loves everything about them and he uses emulators of o ...

  5. Python-爬取"我去图书馆"座位编码

    原文地址:http://fanjiajia.cn/2018/11/22/Python-%E7%88%AC%E5%8F%96%E2%80%9D%E6%88%91%E5%8E%BB%E5%9B%BE%E4 ...

  6. NIO--2-代码

    package com.study.nio; import java.io.IOException; import java.net.InetSocketAddress; import java.ni ...

  7. [剑指Offer] 19.顺时针打印矩阵

    [思路]本题关键在于 右->左 和 下->上 两个循环体中的判断条件,即判断是否重复打印. class Solution { public: vector<int> print ...

  8. 一道js的前端面试题,主要弄清楚逗号表达式的作用

    群里看到的一道前端JS面试题.我以为我会,其实我错了.找了很多资料,写下来. var i,j,k; for( i = 0 , j = 0; i < 10 , j < 6; i++ , j+ ...

  9. WebApp之Meta标签总结

    在做WebApp的时候,少不了Meta标签引用,这里总结了下. <meta name="apple-touch-fullscreen" content="yes&q ...

  10. 活泼的CSS 3动态气泡按钮制作

    这一次,我们正在创造一个有用的设置与对CSS3的多重背景和动画的力量动画按钮.通过此按钮包,您可以很容易地变成一个动画按钮,在您的网页上的任何链接只是指定一个类名.没有必要JavaScript.四色主 ...