• IOS中的代理模式


    代理模式介绍:

    
    代理模式官方定义是:为其他对象提供一种代理以控制对这个对象的访问。
    所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。
    在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可
    以在客户端和目标对象之间起到中介的作用。
    
    

    举个好理解的例子来说明:

    
    一个人Person对象,想去买电影票(询问电影票的剩余量,票价等信息),
    但是由于自己没有空,所以他只能委托一个中介(代理商Agent对象)
    帮他去完成这个动作,最后代理商可以把(询问的电影票相关信息)
    回馈给Person。这就是一种典型的设计模式
    
    

    为了展示这个例子,首先建立2个类,Person类和Agent类,下面是Person类的代码清单:

    Person.h

    
    #import <Foundation/Foundation.h>
    #import "Agent.h"
    @interface Person : NSObject
    {
    
    }
    @property(retain,nonatomic) Agent * delegate;  //为Person 设置一个代理Agent!
    - (void)Ticketinfo;
    
    @end
    
    
    

    Person.m

    
    #import "Person.h"
    
    @implementation Person
    
    - (void)Ticketinfo
    {
    NSLog(@"票的价格是%d,剩余量是%d", [_delegate TicketPrice], [_delegate LeftTicketNum]);
    //Person想查询票的信息,其实是代理帮他查询的,他只负责获得结果就行了!
    }
    @end
    
    

    Agent.h

    
    
    #import <Foundation/Foundation.h>
    
    @interface Agent : NSObject
    
    - (int)TicketPrice;
    - (int)LeftTicketNum;
    
    @end
    
    

    Agent.m

    
    #import "Agent.h"
    
    @implementation Agent
    
    - (int)TicketPrice
    {
    return 200;
    }
    
    - (int)LeftTicketNum
    {
    return 10;
    }
    @end
    
    

    main.m

    
    #import <Foundation/Foundation.h>
    #import "Person.h"
    #import "Agent.h"
    int main(int argc, const char * argv[]) {
    @autoreleasepool {
    Person *p = [[Person alloc] init];
    Agent *agent = [[Agent alloc] init];
    
    p.delegate=agent;
    
    [p  Ticketinfo];
    
    
    
    }
    return 0;
    }
    
    

    运行结果为:

    
    2015-07-26 17:43:27.892 Proxy[1711:451007] 票的价格是200,剩余量是10
    
    

    看完上面的例子,大概应该对代理模式有些了解了,不过在实际的项目中,不会这样设计,为什么呢?应为这样耦合行太高,如果Person这个类离开Agent类,是生存不了的。所以应当优化一下代理模式的设计!

    还是接着上面的代码,进行优化设计。首先再建立一个名为TciketSourceData的protocol,然后进行一系列的剪切,复制,修改等简单操作,如下:
    - 把Agent.h中声明的方法剪切到TciketSourceData
    - 然后,再让Agent类遵循TciketSourceData协议,修改后的Agent.h现在的样子是这样的:

    
    #import <Foundation/Foundation.h>
    #import "TicketSourceData.h"
    @interface Agent : NSObject <TicketSourceData>
    
    
    @end
    
    
    • 最后,把Person.h中的 @property(retain,nonatomic) Agent * delegate; 修改成 @property(retain,nonatomic) Agent * delegate;

    然后运行吧,看看结果应该和我们上次演示的一模一样吧。

    注意

    请思考一个问题,利用这种方式,好处在哪里?

    • 首先Person和Agent的耦合性大大降低了!
    • 其次就是,如果Person想找啊其他的Agent002,Agent003做代理也是可以的(只要遵守协议,实现相关协议方法就行)!

    另外需要注意的是,ios开发中很多空间,如UITableView,collectionview等都利用的这种代理模式,一般充当代理角色的事Controller!如有兴趣,可以自己去研究一下!本篇文章主要介绍这种思想!

    好了,ios中的代理模式先介绍到这里,下一篇博客介绍ios中的MVC设计模式,敬请关注!

  • 相关阅读:
    [ Docker ] 基础安装使用及架构
    [ Docker ] 基础概念
    Nginx
    ELK
    SVN + Jenkins 构建自动部署
    Zabbix
    ELK
    ELK 部署文档
    vue.js在visual studio 2017下的安装
    vue.js是什么
  • 原文地址:https://www.cnblogs.com/jcy23401/p/4703672.html
Copyright © 2020-2023  润新知