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

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

简单的代理实现:

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

Person类

#import <Foundation/Foundation.h>
#import "Medium" @interface Person : NSObject @property(nonatomic,retain) Medium *delegate;
// 买房
- (void)buyHome; @end @implementation Person - (void)buyHome
{
double price = [_delegate homePrice];
double size = [_delegate homeSize];
NSLog(@"房屋中介反馈: 房子价格:%f 房屋面积:%f",price,size);
} - (void)dealloc
{
// 成员变量用到retain关键字,必须在dealloc中销毁一次,这块不详细讲内存管理。
[_delegate replease];
[super dealloc];
} @end

NOTE

person类都做了什么?

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

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

Medium类

#import <Foundation/Foundation.h>

@interface Medium : NSObject

// 房子的价格
- (double)homeCost; // 房子大小
- (double)homeSize; @end @implementation Medium // 房子的价格
- (double)homeCost;
{
return ;
} // 房子大小
- (double)homeSize
{
return ;
} @end

NOTE

medium类做了什么?

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

main类

#import <Fundation/Foundation.h>
#import "Person"
#import "Medium" int main(int argv,const char* argc[])
{ @autoreleasepool
{
Person *person = [[[Person alloc]init]autorelease];
Medium *medium = [[[Medium alloc]init]autorelease]; // person获取中介的实例对象
person.delegate = medium; // 中介提供房子的详细情况
[person buyHome];
}
return ;
}

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

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

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

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

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

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

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

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

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

中介:必须有……。

正直意义的代理:

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

分析:

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

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

协议的定义:

@protocol BuyHomeDelegate : NSObject

// optional 中定义的方法是可选择性的实现
@optional // required 中定义的方法必须实现
@required
- (double)homePrice;
- (double)homeSize; @end

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

#import <Foundation/Foundation.h>
#import "Medium"
#import "BuyHomeDelegate" @interface Person : NSObject @property(nonatomic,retain) id<BuyHomeDelegate> delegate;
// 买房
- (void)buyHome; @end @implementation Person - (void)buyHome
{
double price = [_delegate homePrice];
double size = [_delegate homeSize];
NSLog(@"房屋中介反馈: 房子价格:%f 房屋面积:%f",price,size);
} - (void)dealloc
{
// 成员变量用到retain关键字,必须在dealloc中销毁一次,这块不详细讲内存管理。
[_delegate replease];
[super dealloc];
} @end #import <Foundation/Foundation.h>
#import "BuyHomeDelegate"
@interface Medium : NSObject <BuyHomeDelegate> // 房子的价格
- (double)homeCost; // 房子大小
- (double)homeSize; @end @implementation Medium // 房子的价格
- (double)homeCost;
{
return ;
} // 房子大小
- (double)homeSize
{
return ;
} @end #import <Fundation/Foundation.h>
#import "Person"
#import "Medium" int main(int argv,const char* argc[])
{ @autoreleasepool
{
Person *person = [[[Person alloc]init]autorelease];
Medium *medium = [[[Medium alloc]init]autorelease]; // person获取中介的实例对象
person.delegate = medium; // 中介提供房子的详细情况
[person buyHome];
}
return ;
}

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

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

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

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. (Step by Step)How to setup IP Phone Server(VoIP Server) for free.

    You must have heard about IP Phone and SIP (Software IP Phone).Nowadays standard PSTN phone are bein ...

  2. Scala IDE for Eclipse的下载、安装和WordCount的初步使用(本地模式和集群模式)

    包括: Scala IDE for Eclipse的下载  Scala IDE for Eclipse的安装 本地模式或集群模式 我们知道,对于开发而言,IDE是有很多个选择的版本.如我们大部分人经常 ...

  3. Centos6.3建立FTP

    2014年2月22日 16:54:20 1. 安装ftp     yum install vsftpd ftp 2. 编辑/etc/vsftpd/vsftpd.conf     chroot_list ...

  4. C++库研究笔记——生成一组随机数

    当试图用 srand(time(0)) rand() 生成一组随机数时发现,生成的数字很多都是「一样」的 经过测试:srand(seed); rand() 生成随机数,当seed一样时,生成的随机数相 ...

  5. C++ Virtual详解

    转自:http://www.cnblogs.com/xd502djj/archive/2010/09/22/1832912.html Virtual是C++ OO机制中很重要的一个关键字.只要是学过C ...

  6. FindStringExact

          Code:: CComboBox::FindStringExact int FindStringExact( int nIndexStart, LPCTSTR lpszFind ) con ...

  7. Linux守护进程的编程实现

    Linux 守护进程的编程方法 守护进程(Daemon)是执行在后台的一种特殊进程.它独立于控制终端而且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种非常实用的进程.Linux的大多数s ...

  8. 【剑指offer】包括min函数的栈

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26064213 剑指offer上的第21题,之前在Cracking the Coding i ...

  9. Dom4j 学习笔记

    dom4j 是一种解析 XML 文档的开放源代码 XML 框架.dom4j下载地址 本文主要记载了一些简单的使用方法. 一.xml文件的解析 dom4j既可以解析普通的xml文件,也可以解析一个Inp ...

  10. Docker中开启sshd服务

    ssh服务安装 安装ssh服务 #yum install openssh-server -y 安装passwd(修改密码需要) #yum install passwd -y 修改sshd_config ...