我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式。还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的。当时学习Spring的时候用到了接口回调,其实就是实现的委托代理模式。简单的说代理就是把相应的功能交给实现接口的相应的类中来解决。在OC中没有接口该如何实现代理呢?前面的博客中笔者说提了一句,在OC中的协议和Java中的接口极为相似,都是只声明方法而不去实现,方法的实现在OC中交个遵循协议的类,而在Java中方法的实现交给实现接口的类。其实学习一门新的语言和以前学习过的语言对比着理解还是蛮好理解的,废话少说,切入正题,谈一下OC中的委托代理模式。

下面还是用房屋中介和房东的例子来表示OC中的代理模式。包租公把房子委托给租房中介来出租,包租公每月收房租就ok啦~。

1.在Java中写代理的话,我会先写房屋中介的接口,所以在OC中我们首先也要先声明房屋中介的协议,Protocol中的方法是每个房屋中介必须有的方法,所以在Java中会抽象成接口,而在OC中我们会把他声明为协议,然后让每个方法声明为必须的,协议如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//
//  RentHouse.h
//  Memory
//
//  Created by ludashi on 14-8-7.
//  Copyright (c) 2014年 Mr.li. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol RentHouse <NSObject>
//在卖房子协议里定义两个必须的方法
@required
//中介卖房子
- (void)rentHouse;
//把钱给用户
- (void)payMoney;
@end

2.房屋中介的协议声明完我们先不用着急,声明中介类的,因为中介太多啦! 包租公要租房房子,客户就是上帝,所以我们先变包租公类, 包租公对中介公司的要求不高只要能给我把房子租出去,然后给钱就完事,所以只要遵守之前定义的房屋中介的协议即可,我们可以这样定义包租公:

interface代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//  Landlord.h
//  Memory
//
//  Created by 鲁大师 on 14-8-7.
//  Copyright (c) 2014年 Mr.li. All rights reserved.
//
 
#import <Foundation/Foundation.h>
//引入协议
#import "RentHouse.h"
@interface Landlord : NSObject
//房东的中介公司,符合买房子和付款都行
//agent是符合协议的对象传入都行
@property (assign) id<RentHouse> agent;
 
//往外租房,委托给代理公司
-(void) rentHouse;
 
//包租婆收租啦
-(void) receiveMoney;
@end

实现代码: 在实现代码中包租公会把房子通过协议中的saleHouse方法委托给租房中介

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#import "Landlord.h"
 
@implementation Landlord
 
//往外租房,委托给代理公司
-(void) rentHouse
{
    NSLog(@"我是包租公: ludashi, 我把房子租出去了!");
    //调用委托公司的卖房方法,委托关系调用
    [self.agent rentHouse];
}
 
 
//包租婆收租啦
-(void) receiveMoney
{
    NSLog(@"ludashi: 每个月我包租公最高兴,因为又可以收租啦!");
}
@end

3.包租公妥啦以后我们就开始找中介公司啦,中介公司首先得符合我们的协议(在java中就是要实现我们之前的接口),在中介公司中因为要和包租公建立合作关系所以用到了包租公的类,我们用@class来声明,目的减少模块之间的耦合性。

interface代码如下:

1
2
3
4
5
6
7
8
9
#import <Foundation/Foundation.h>
//引入协议文件
#import"RentHouse.h"
//为了解耦我们用@class声明房东类,代替引入房东的头文件
@class Landlord;
@interface HouseSaler : NSObject<RentHouse>
//房东为中介的客户,所以定义一个客户对象
@property (assign) Landlord *customer;
@end

实现方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#import "HouseSaler.h"
#import "Landlord.h"
 
@implementation HouseRent
//实现卖房方法
-(void)RentHouse
{
    NSLog(@"agent: 租房了,我在有好多房子;");
    [self payMoney];
 
}
//付钱给用户
-(void) payMoney
{
    NSLog(@"agent:房子租出去啦!哎!得把钱给用户啊!!");
    [self.customer receiveMoney];
}
@end

4.测试:包租公要找中介公司

1
2
3
4
5
6
7
8
9
10
11
12
//委托模式的测试
//实例化包租公
Landlord *ludashi = [Landlord new];
//实例化中介
HouseSaler *agent = [HouseRent new];
 
//用户选择代理公司,这个公司只要遵守出租协议即可
ludashi.agent = agent;
agent.customer = ludashi;
 
//房东买房
[ludashi rentHouse];

运行结果:

1
2
3
4
2014-08-07 18:04:01.717 Memory[21273:303] 我是包租公: ludashi, 我把房子租出去了!
2014-08-07 18:04:01.719 Memory[21273:303] agent: 租房了,我在有好多房子;
2014-08-07 18:04:01.719 Memory[21273:303] agent:房子租出去啦!哎!得把钱给用户啊!!
2014-08-07 18:04:01.720 Memory[21273:303] ludashi: 每个月我包租公最高兴,因为又可以收租啦!

  上面测试时我们是通过代码直接把房屋出租公司和包租公进行合作关系的,更合理的做法是在租赁公司中加一个注册方法,方便用户和租赁公司形成委托关系,所以很有必要实现我们的register方法,在房屋租赁公司里加入注册方法,其他的不需要改变,代码如下:

 //实现注册方法,把房东的对象传入中介
-(void)registerInfo:(Landlord *)vCustomer
{
//建立委托关联,产生委托关系
self.customer = vCustomer;
//包租公选择了一家符合协议的房屋出租公司
self.customer.agent = self;
}

  那么我们进行测试的时候需要通过register方法来进行成立合作关系

  测试时把代码

 //用户选择代理公司,这个公司只要遵守出租协议即可
ludashi.agent = agent;
agent.customer = ludashi;

  换成

        //用户在房屋出租公司进行用户注册形成合作关系
[agent registerInfo:ludashi];

  即可,其实本子上就是把上面的两行代码进行了一个封装,大概就是设计模式中的模板方法模式吧。到这的话委托代理模式就差不多了

  上面的总结暂且这么说吧,是根据笔者自己的理解所总结的内容,不免有偏颇之处,欢迎批评指正,转载请注明出处。

  

Objective-C中的委托(代理)模式的更多相关文章

  1. 简介Python设计模式中的代理模式与模板方法模式编程

    简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...

  2. OC中的代理模式

    OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍OC中是如何实现代理模式的.这里举一个简单的例子:小孩类,护士类,保姆类,其中小孩类有两个方法 ...

  3. (转)轻松学,Java 中的代理模式及动态代理

    背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...

  4. 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...

  5. 谈谈Java中的代理模式

    首先来看一下代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用, 其特征是代理类与 ...

  6. Java中的代理模式

    代理模式在Java Web的框架中经常使用到.比如说在对数据库的访问中,核心功能是对数据库的增删改查,而连接数据库.处理事务等功能我们在开发中也要考虑到.所以我们将数据库的CRUD抽象到接口中,然后实 ...

  7. 说说Java中的代理模式

    今天看到传智播客李勇老师的JDBC系列的第36节——通过代理模式来保持用户关闭连接的习惯.讲的我彻底蒙蔽了,由于第一次接触代理模式,感到理解很难,在博客园找到一篇文章,先记录如下: 引用自java设计 ...

  8. 理解Android系统的进程间通信原理(一)----RPC中的代理模式

    Android系统中的进程间通信是通过一个轻量级的RPC(Remote Procedure Call远程进程调用)和AIDL(Android Interface Definination Langua ...

  9. 深入理解JAVA中的代理模式

    前言 代理是什么 事故现场:我家的宠物今天生病了,而我又没有相关的医学知识,所以我只让我的宠物多喝热水吗? 结果显然是不行的,所以我需要去找宠物医生这些更专业的人来帮我的宠物治病. 这个时候,代理就出 ...

随机推荐

  1. JSON数据和对象

    在js中像数字类型.字符串类型.布尔类型这些都不能再被拆分,属于基本类型.与之相对有一种复杂类型:对象类型,它是本身由多个其他类型组合而成的. 创建对象有两种方法,一.new Object()创建一个 ...

  2. 格式化input输入内容(金额)

    项目中要用到格式化金额输入框,要求每三个数字用逗号分割开. 添加一个directive angular.module('myApp.directives', []) .directive('filte ...

  3. Mac下搭建hexo

    Mac下搭建hexo 并部署到gitcafe 1.安装brewhome ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homeb ...

  4. 最小生成树 prime zoj1586

    题意:在n个星球,每2个星球之间的联通需要依靠一个网络适配器,每个星球喜欢的网络适配器的价钱不同,先给你一个n,然后n个数,代表第i个星球喜爱的网络适配器的价钱,然后给出一个矩阵M[i][j]代表第i ...

  5. 正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法

    正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法 例如:一个android程序包含两个Activity,分别为MainActivity和Other ...

  6. 走向面试之数据库基础:三、SQL进阶之变量、事务、存储过程与触发器

    一.变量那点事儿 1.1 局部变量 (1)声明局部变量 DECLARE @变量名 数据类型 ) DECLARE @id int (2)为变量赋值 SET @变量名 =值 --set用于普通的赋值 SE ...

  7. 【Java并发编程实战】-----“J.U.C”:ReentrantLock之一简介

    注:由于要介绍ReentrantLock的东西太多了,免得各位客官看累,所以分三篇博客来阐述.本篇博客介绍ReentrantLock基本内容,后两篇博客从源码级别分别阐述ReentrantLock的l ...

  8. 扫描仪API接入大全:Twain, WIA 或 两者不具有.[换个思路 春暖花开]

    最近做和扫描仪接入的扫描应用程序,深深感觉到了来自底层设备和WINDOWS协议的恶意.软件专业,对计算机深层次通知机制和协议,以及与之相连接的机器的接入协议和一些参数,当时并木有认真学习和了解,前一阵 ...

  9. 【VC++技术杂谈003】打印技术之打印机状态监控

    在上一篇博文中我主要介绍了如何获取以及设置系统的默认打印机,本文将介绍如何对打印机状态进行实时监控,记录下所打印的文档.打印的份数以及打印时间等打印信息. 1.打印机虚脱机技术 在正式介绍如何对打印机 ...

  10. Node.js Base64 Encoding和Decoding

    如何在Node.js中encode一个字符串呢?是否也像在PHP中使用base64_encode()一样简单? 在Node.js中有许多encoding字符串的方法,而不用像在JavaScript中那 ...