1、代理模式之我解定义:为其它对象提供一种代理以用来控制这个对象,我们不需要关心代理是如何完成的,只关心代理有没有完成。
在看完李明杰老师的课程后,我对代理也有了一个初步的了解,虽然很浅显,但是也明白了代理模式的一些作用跟方法。举个例子来说:有一个人A,他本身不会自己做饭和做家务等一些事情,于是A就请了一个保姆,于是A与保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人。即A与保姆之间有个协议,保姆继承改协议,于是保姆就需要实现该协议中的条款成为代理人。2、代理模式的关键点:A想完成一件事,但是自己不能完成,于是他找个代理人B替他完成这个事情,他们之间便有个协议(protocal),B继承该协议来完成A代理给他的事情。
条件:如果要成为代理,则必须遵守某个协议(协议用于声明方法,限制代理必须拥有某个方法)。
3、优点:耦合性较低,增加了代码的弹性。代理和对象之间互不影响。
举例说明:小明想看电影,但是没时间买票,于是小明就委托小强去买票,去之前他很小强签订了一份买票协议TickProtocol,明确告知小强询问票价和剩余票数。
于是便有了下面的故事:
通过上面的故事我们可以知道,有了代理后,Person不需要自己跑到电影院就可以买到票和票的剩余数了。Person也不关心Agent是怎么得到票的价格和剩余数的,Person只想得到结果,并不想知道得到结果的过程。// 协议TickProtocol.h #import <Foundation/Foundation.h> @protocol TickProtocol <NSObject> - (int)PriceTick; // 声明询问票价格的方法 - (int)LeftTick; // 声明剩余票数的方法 @end //代理Agent.h文件 #import <Foundation/Foundation.h> @protocol TickProtocol; // 在代理头文件中声明有TickProtocol协议 @interface Agent : NSObject<TickProtocol> // 代理必须遵守这份协议 @end // 代理Agent.m文件 #import "Agent.h" #import "TickProtocol.h" @implementation Agent // 实现协议中的询问票的价格 - (int)PriceTick { return 80; } // 实现协议中的查看剩余票的方法 - (int)LeftTick { return 1; } @end //Person.h文件 #import <Foundation/Foundation.h> @class Agent; // 声明有Agent类 @protocol TickProtocol; // 声明有TickProtocol协议 @interface Person : NSObject // 声明买票方法 - (void)Buy; // 声明一个代理 @property (nonatomic,retain)id<TickProtocol> DeleAgent; // 代理属性DeleAgent遵守协议TickProtocol @end //人Person.m文件 #import "Person.h" #import "Agent.h" #import "TickProtocol.h" @implementation Person // 实现买票方法 - (void)Buy { int Price = [_DeleAgent PriceTick]; // 调用代理的方法买票 int LeftTick = [_DeleAgent LeftTick]; // 调用代理方法查看票的剩余数量 NSLog(@"price = %d,leftTick = %d",Price,LeftTick); } @end //main 文件 #import <Foundation/Foundation.h> #import "Person.h" #import "Agent.h" #import "Agent2.h" int main(int argc, const char * argv[]) { @autoreleasepool { // 创建人对象p Person *p = [[Person alloc] init]; // 创建代理对象a Agent *a = [[Agent alloc] init]; // 人的代理指向a p.DeleAgent = a; [p Buy]; } return 0; }