f(sixleaves) = sixleaves

重剑无锋 大巧不工

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  95 随笔 :: 0 文章 :: 7 评论 :: 0 Trackbacks
所谓的代理设计模式,其设计目的就是为了解耦合,让不用改变主体代码逻辑的情况下,把代理对象所属于的类可以替换掉为不同的类。
请先看如下代码。
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.定义成员变量为万能指针,并且该对象必须是继承某个协议。
posted on 2015-05-13 16:39 swp 阅读(481) 评论(0)  编辑 收藏 引用 所属分类: objective-c

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理