详述 IOS 之代理模式(Objective-c)

1. 什么是代理模式?
代理模式是在 IOS 中经常遇到的一种设计模式,那什么叫做代理模式呢? 举个例子:有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情, 而保姆就是这个代理人, 即:婴儿和保姆之间有个协议,保姆继承该协议,于是保姆就需要实现该协议中的条款成为代理人。

2. 为什么使用代理模式?
A 完成一件事,但是自己不能完成,或是自己完成这件事情要花费非常大的精力,于是他找个代理人 B 替他完成这个事情,他们之间便有个协议 (protocol),B 继承该协议来完成 A 代理给他的事情。

3. 代理模式实例分析
这里举个顾客与经销商的例子。顾客与经销商之间存在联系,顾客的买卖行为要通知经销商,经销商获取顾客买东西的通知,并作出相应处理。

相关文件内容组织如下图所示(采用分栏显示):
Customer 类表示顾客,ViewController 类表示经销商。
这里写图片描述

这里写图片描述

由上述所知,顾客的经销商是一个完全给定的对象,经销商对象已经被写死了,就是当前的 ViewController。客户与当前经销商的紧密联系阻碍了客户与其他经销商联系的途径,此时便是使用代理的时候,具体文件内容改变后如下图所示(采用分栏显示):
同样的,Customer 类表示顾客,ViewController 类表示经销商。
这里写图片描述

这里写图片描述

此时,经销商成为一个代理,这个代理可以服务于任何支持这种协议的对象。

@property (nonatomic,weak) id<CustomerDelegate> delegate;

注意点

1.在是使用代理模式的时候,经常需要将代理对象传递出去,所以会用到 @class 将代理对象所属的类提前声明。

@class Customer;

@protocol CustomerDelegate <NSObject>
@required
- (void)customer:(Customer *)customer buyItemCount:(NSInteger )count;
@end

@interface Customer : NSObject
//经销商
@property (nonatomic,weak) id<CustomerDelegate> delegate;
//顾客买卖行为
- (void)buyItemCount:(NSInteger )count;
@end

@class :只是告诉编译器,这是一个类,声明类。而在实现类中如果要用到被引用类中的实体变量和方法,在 .m文件中需要使用#import来包含被引用类的头文件。

2.使用代理的时候为避免循环引用,需用 weak 指示代理变量。

@property (nonatomic,weak) id<CustomerDelegate> delegate;

3.在让代理执行某种方法的时候,需验证代理对象是否存在,以及该代理对象是否能够相应某种方法。

if (self.delegate && [self.delegate respondsToSelector:@selector(customer:buyItemCount:)]) {
        [self.delegate customer:self buyItemCount:count];
    }

如果单纯只验证代理对象是否存在而不验证该代理对象能否相应相应方法,在执行时若代理并没有实现指定方法,则会导致程序崩溃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值