所谓的代理设计模式,其设计目的就是为了解耦合,让不用改变主体代码逻辑的情况下,把代理对象所属于的类可以替换掉为不同的类。
请先看如下代码。
Person.h
1 #import <Foundation/Foundation.h>
2
3 @class Agent;
4
5 @interface Person : NSObject
6
7 - (void)buyTicket;
8
9 @property (nonatomic, strong) Agent* delegate;
10
11 @end
12
Person对象,不想通过自己去买票,叫一个助手去买,这个助手就是个代理。但是如果我们直接这样实现,Agent就写死了,也就是对象类型是写死得。
下次如果代码中更换了一个NextAgent类,则还要更改类名。或者假如Agent在项目中去掉了,那么Person这个类的buyTicket也就萎了。也就是说,
耦合性是强,所以我们可以借用protocol来实现解耦合的代理设计模式。具体的思想就是,通过protocol定义了一组代理们必须实现的方法。并且将Agent *
替换成万能指针id。这样的话就是id<TicketProtocol> delegate.也就说delegate是个仁义实现了TicketProtocol的对象,我们可以通过这个对象来购买票。
更重要的是统一了逻辑,具体的逻辑交给了要继承这个TicketProtocol的类去实现。这样我们就不用改变Person.m中的代码。说了这么多,先看下Person.m
中的代码,理解下~。
Person.m
1 #import "Person.h"
2 #import "Agent.h"
3 @implementation Person
4
5 - (void)buyTicket
6 {
7 /*
8 需求让代理帮忙询问下票价,剩余的张数
9 */
10
11 double price = [_delegate ticketPrice];
12
13 int number = [_delegate leftTicketsNumber];
14
15 NSLog(@"票价%lf, 剩下%d张", price, number);
16 }
17
18
19 - (void)dealloc
20 {
21
22 NSLog(@"Person-dealloc");
23
24 }
25
26 @end
27
Agent有两个方法,分别为ticketPrice和leftTicketsNumber。分别返回一个价格和剩余票数。模拟实现很简单,所以Agent不详细
给出。
main.m
1 #import <Foundation/Foundation.h>
2 #import "Person.h"
3 #import "Agent.h"
4 int main(int argc, const char * argv[]) {
5
6 // 代理设计模式
7
8
9 Person *p = [[Person alloc] init];
10
11 Agent *a = [[Agent alloc] init];
12
13 p.delegate = a;
14
15 [p buyTicket];
16
17 return 0;
18 }
19
那么具体如何改变,请看更改后的代码:
TicketProtocol.h
1 #import <Foundation/Foundation.h>
2
3 @protocol TicketProtocol <NSObject>
4
5 - (double)ticketPrice;
6
7 - (int)leftTicketsNumber;
8
9 @end
10
Person.h
1 #import <Foundation/Foundation.h>
2
3 @protocol TicketProtocol;
4
5
6 @interface Person : NSObject
7
8 - (void)buyTicket;
9
10 @property (nonatomic, strong) id<TicketProtocol> delegate;
11
12 @end
======华丽的分割线===========
这样更改之后,就算你在更换代理,也不会Person类的代码也不需要更改。
总结
代理的概念:
当某个类的功能交个其他类去实现。那个实现的类就是代理。
代理模式使用场合:
1.用来解耦合。当一个类的功能需要其他类来实现,又不确定是由哪个类来实现,可以使用代理设计模式。
代理设计模式的实现:
1.定义成员变量为万能指针,并且该对象必须是继承某个协议。