之前看过一些关于代理的资料,始终感觉还是很模糊,最近抽出一段空闲的时间,将这块内容整理下:

什么是代理,顾名思义就是帮别人做些事情,比如买房子,当我们买房子时,我们一般会找房屋中介,因为他们就是干这件事情,他们比我们普通人在这方面了解的多,此时房屋中介就是我们所谓的代理,他们将会提供买房者所需的资料,比如房屋的价格,房屋的面积等信息,根据以上环境我们开始编码,实现通过代理模式实现以上功能。

简单的代理实现:

1.代理,听到这个词我们很明确知道我们需要两个主角(1)买房子的人(person)(2)房子中介(medium),房子中介需要做我们的代理,帮我们处理一些事物,知道这些首先定义两个类:

Person类

  1. #import <Foundation/Foundation.h>
  2. #import "Medium"
  3.  
  4. @interface Person : NSObject
  5.  
  6. @property(nonatomic,retain) Medium *delegate;
  7. // 买房
  8. - (void)buyHome;
  9.  
  10. @end
  11.  
  12. @implementation Person
  13.  
  14. - (void)buyHome
  15. {
  16. double price = [_delegate homePrice];
  17. double size = [_delegate homeSize];
  18. NSLog(@"房屋中介反馈: 房子价格:%f 房屋面积:%f",price,size);
  19. }
  20.  
  21. - (void)dealloc
  22. {
  23. // 成员变量用到retain关键字,必须在dealloc中销毁一次,这块不详细讲内存管理。
  24. [_delegate replease];
  25. [super dealloc];
  26. }
  27.  
  28. @end

NOTE

person类都做了什么?

1):买房者需要买房,那我们必须提供一个买房的方法,buyHome()。

2):买房必须知道房屋的面积以及价格,这些信息必须通过房屋中介获取,因此我们需要将房屋中介引入到Person类中。

Medium类

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Medium : NSObject
  4.  
  5. // 房子的价格
  6. - (double)homeCost;
  7.  
  8. // 房子大小
  9. - (double)homeSize;
  10.  
  11. @end
  12.  
  13. @implementation Medium
  14.  
  15. // 房子的价格
  16. - (double)homeCost;
  17. {
  18. return ;
  19. }
  20.  
  21. // 房子大小
  22. - (double)homeSize
  23. {
  24. return ;
  25. }
  26.  
  27. @end

NOTE

medium类做了什么?

1):房屋中介需要从买房者哪里获取到房屋面积,以及出售的价格,以提供给买房者。

main类

  1. #import <Fundation/Foundation.h>
  2. #import "Person"
  3. #import "Medium"
  4.  
  5. int main(int argv,const char* argc[])
  6. {
  7.  
  8. @autoreleasepool
  9. {
  10. Person *person = [[[Person alloc]init]autorelease];
  11. Medium *medium = [[[Medium alloc]init]autorelease];
  12.  
  13. // person获取中介的实例对象
  14. person.delegate = medium;
  15.  
  16. // 中介提供房子的详细情况
  17. [person buyHome];
  18. }
  19. return ;
  20. }

流程图:(以下流程图是一个完整买房流程)

根据这个流程图我们再分析下买房这个过程:

1)房屋中介通过自己方式获取到卖方者的一切属性,比如房屋的价格,房屋的面积,房屋的地理位置。

2)房屋中介提供房源信息给买房者。

3)买房者决定最终是否购买房子。

这个流程图中我们只需要关注橙色区域的对象,买房者和房屋中介。

买房者:中介我想了解下现有房源的价格,面积,地址。

中介:我们这里现在有100*100m,价格在200W的房子,地址在上海泗泾,你看是否需要。

买房者:这套房子还不错,考虑下,还有其他选择嘛。

中介:必须有……。

正直意义的代理:

以上是一个简单的代理模式,买房者无需通过卖方者的获取房屋信息,一家一家问太累了,直接问中介多省事,但是有个问题,如果买房者把这件事情和其他人交流了下,其中有人说,这家中介太黑了,收取的中介费比其他中介高的高,此刻怎么办,最简单的方式就是换另外一家中介,那程序中又是如何实现。

分析:

此刻我们需要把那家中介(medium)从我们的person类中剔除,person需要一个动态的中介,可以选择的中介。

如果是这样,我们就必须定义协议,如果那个中介想申请当我的代理,那就必须遵守我们的协议,不然我就不考虑,那我协议中都定义什么方法了,和上面的方法一样,一个是房子的价格,一个是房子的面积。

协议的定义:

  1. @protocol BuyHomeDelegate : NSObject
  2.  
  3. // optional 中定义的方法是可选择性的实现
  4. @optional
  5.  
  6. // required 中定义的方法必须实现
  7. @required
  8. - (double)homePrice;
  9. - (double)homeSize;
  10.  
  11. @end

person+medium类 (以下代码,改变了细节性的地方,用粗体标识,目的是不依赖具体某一个代理,而是接受我的协议,便可做我的代理)

  1. #import <Foundation/Foundation.h>
  2. #import "Medium"
  3. #import "BuyHomeDelegate"
  4.  
  5. @interface Person : NSObject
  6.  
  7. @property(nonatomic,retain) id<BuyHomeDelegate> delegate;
  8. // 买房
  9. - (void)buyHome;
  10.  
  11. @end
  12.  
  13. @implementation Person
  14.  
  15. - (void)buyHome
  16. {
  17. double price = [_delegate homePrice];
  18. double size = [_delegate homeSize];
  19. NSLog(@"房屋中介反馈: 房子价格:%f 房屋面积:%f",price,size);
  20. }
  21.  
  22. - (void)dealloc
  23. {
  24. // 成员变量用到retain关键字,必须在dealloc中销毁一次,这块不详细讲内存管理。
  25. [_delegate replease];
  26. [super dealloc];
  27. }
  28.  
  29. @end
  30.  
  31. #import <Foundation/Foundation.h>
  32. #import "BuyHomeDelegate"
  33. @interface Medium : NSObject <BuyHomeDelegate>
  34.  
  35. // 房子的价格
  36. - (double)homeCost;
  37.  
  38. // 房子大小
  39. - (double)homeSize;
  40.  
  41. @end
  42.  
  43. @implementation Medium
  44.  
  45. // 房子的价格
  46. - (double)homeCost;
  47. {
  48. return ;
  49. }
  50.  
  51. // 房子大小
  52. - (double)homeSize
  53. {
  54. return ;
  55. }
  56.  
  57. @end
  58.  
  59. #import <Fundation/Foundation.h>
  60. #import "Person"
  61. #import "Medium"
  62.  
  63. int main(int argv,const char* argc[])
  64. {
  65.  
  66. @autoreleasepool
  67. {
  68. Person *person = [[[Person alloc]init]autorelease];
  69. Medium *medium = [[[Medium alloc]init]autorelease];
  70.  
  71. // person获取中介的实例对象
  72. person.delegate = medium;
  73.  
  74. // 中介提供房子的详细情况
  75. [person buyHome];
  76. }
  77. return ;
  78. }

流程图:(以下流程图是一个完整买房流程)

补充一点:以上代码纯手工打造,无污染绿色环保,可能会有小问题,需要调试。

总结:第一个简单的代理和第二个真正意义的代理,思想都是相同的,第一个为了说明代理的问题,第二个是在实际开发中运用的,最后也请各位朋友多提问题,以及后续的交流:

IOS代理的更多相关文章

  1. QF——iOS代理模式

    iOS的代理模式: A要完成某个功能,它可以自己完成,但有时出于一些原因,不方便自己完成.这时A可以委托B来帮其完成此功能,即由B代理完成.但是这个功能不是让B随随便便任其完成.此时,会有一个协议文件 ...

  2. iOS代理模式

    iOS代理模式的简单理解:当一个对象无法直接获取到另一个对象的指针,又希望对那个变量进行一些操作时,可以使用代理模式. 代理主要由三部分组成: (1)协议:用来指定代理双方可以做什么,必须做什么. ( ...

  3. 你真的了解iOS代理设计模式吗?

    在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大 ...

  4. iOS 代理反向传值

    在上篇博客 iOS代理协议 中,侧重解析了委托代理协议的概念等,本文将侧重于它们在开发中的应用. 假如我们有一个需求如下:界面A上面有一个button.一个label.从界面A跳转到界面B,在界面B的 ...

  5. 【转】你真的了解iOS代理设计模式吗?

    转自:http://www.cocoachina.com/ios/20160317/15696.html 在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递 ...

  6. IOS 代理的简单实现

    原文 http://www.cnblogs.com/lovekarri/archive/2012/03/04/2379197.html 昨天做了一个demo,用到了简单代理. delegate是ios ...

  7. iOS代理模式(delegate)的使用

    前言: 代理模式是iOS中非常重要的一个模式,iOS SDK中的系统控件几乎都用到了代理模式.代理模式用来处理事件监听.参数传递功能. 协议创建(Protocol): 可手打如下代码,或者在代码块里面 ...

  8. iOS 代理 重定向消息 forwardInvocation

    今天简单研究一下iOS的重定向消息forwardInvocation: 首先看看Invocation类: @interface NSInvocation : NSObject { @private _ ...

  9. iOS 代理设计模式

    在项目中经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式传递一些参数. 在项目中,刚开始我是用一些代理来传递参数的,但是慢慢觉得代理的代码比较block多,所以就更多的使用 ...

  10. fiddler 进行Android/IOS代理配置抓包

    1.准备:Android+IOS设备 下载:fiddler抓包工具,不是最新版的链接:   链接:https://pan.baidu.com/s/1BaBfu2H4xgpsh1wmkfC8aQ     ...

随机推荐

  1. 解决android锁屏或解锁后activity重启的问题

    If your target build version is Honeycomb 3.2 (API Level 13) or higher you must put the screenSize f ...

  2. PC-飞起来!我的Windows XP——五步快速优化Windows XP

    虽然Microsoft的 Vista已经发售了快一年,但国内大部分系统用户仍使用着目前堪称完美的Windows XP.与以往的Windows操作系统一样,新安装的Windows XP可能还不在最佳状态 ...

  3. Jquery JS 正确比较两个数字大小的方法

    if(2 > 10) { alert("不正确!"); } 此比较不会是想要的结果:它相当于2 >1,把10的第一位取出来比较. ——————————————————— ...

  4. GNU LIBC源代码学习之strcmp

    比較两个字符串 我的代码块 #include <string.h> int my_strcmp(const char* s1,const char * s2) { if((s1==NULL ...

  5. 利用http协议实现图片窃取

    在http协议里有一个referer,用来标示站点来源,大家都遇到这样的情况.转载了一篇博客,图片显示不正常,就和头信息里这个有关 原理:在webserver里面.依据http协议里面refered头 ...

  6. 编译Android4.3内核源代码

     --------------------------------------------------------------------------------------------------- ...

  7. 我的Android开发相关文章

    Pro Android学习笔记: Pro Android学习笔记(一零七):2D动画(2):layout渐变动画 2014.7.25 Pro Android学习笔记(一零六):2D动画(1):fram ...

  8. Android执行shell命令

    一.方法 /** * 执行一个shell命令,并返回字符串值 * * @param cmd * 命令名称&参数组成的数组(例如:{"/system/bin/cat", &q ...

  9. MySQL——索引与优化

    http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调 ...

  10. android 沉浸通知栏

    IOS的沉浸式通知栏很高大上,通知栏和app统一颜色或样式,很美观.android上面也早就人实现这种效果了. 我在这边也写一个实现通知栏沉浸式的方法,目前只实现了相同颜色. 先要改布局文件xml & ...