zoukankan      html  css  js  c++  java
  • 黑马程序猿_ 利用oc的协议实现代理模式

    先说下代理模式是什么吧


    定义: 为其它对象提供一种代理以控制对这个对象的訪问。在某些情况下,一个对象不适合或者不能直接引用还有一个对象

    而代理对象能够在client和目标对象之间起到中介的作用。


    在看过李明杰老师的课程后,我对代理模式有了最初步的理解,尽管还非常浅显 可是也明确了代理模式的

    一些作用跟使用方法。首先使用代理模式能够减少耦合度。

    大大的增强了代码的弹性。


    举个样例,小明想看电影。可是没时间买票 于是就拜托小强去买票


    最简单的方式就是 建立一个person类(小明) 一个agent类(代理类)

    agent类 帮person去买票或者问票价 而且返回消息 给person

    这种话person仅仅须要 调用 agent就能够获得自己想要的消息 很方便


    可是 , 代理并不仅仅是有一个 当person想换还有一个代理的时候 就须要换成还有一个代理 nextagent

    非常明显 这样会非常麻烦 于是我们想到了 使用万能指针 id类型。 这样就能够不用每次都改变代码

    可是这样做就会出另外的问题,使用id声明 一个代表着代理的变量时  系统是不“认识”它的 由于

    这属于 执行期的多态  在编译期无法识别 代理类 nextagent中 的方法。


    所以我们须要一个更灵活 低耦合的模式

    利用 协议 ,我们能够把协议当做一个 “用户”与 “代理”之间的中转站

    下面是这个样例的协议

    @protocol TicketDelegate <NSObject>
    
    //票价
    - (double) ticketPrice;
    
    //剩了多少张票
    - (int) leftTicketNumber;
    
    
    @end

    让代理类遵守协议 而且实现应该实现的方法

    @interface Agent : NSObject <TicketDelegate>
    
    @end
    


    这样我们就有了 一个能够代理协议 跟一个代理

    另外,我们能够通过协议 实现很多其它的代理 



    @implementation Person
    
    //想看电影
    - (void) buyTicket
    {
        //让代理帮忙买票(询问票价 剩余张数)
        double price = [_delegate ticketPrice];
        int number = [_delegate leftTicketNumber];
        NSLog(@"通过代理知:票价 = %f,剩余票数 = %d",price, number);
    }
    
    @endl

    在person类中 _delegate这个变量代表着 所使用的代理
    在上面已经说了要使用id类型 但id类型必需要遵守协议
    才干使_delegate 可以使用协议中的方法
    这样就攻克了上面所说的无法识别(代理中的方法)的问题


    @interface Person : NSObject
    
    - (void) buyTicket;
    
    //拥有一个代理
    // 必须遵守协议
    @property (nonatomic,retain) id<TicketDelegate> delegate;
    
    @end

    通过使用协议 person能够使用 很多代理 而且 不须要提前知道这个代理详细是什么  仅仅须要知道它遵守什么协议就好了。

    以上就是一个简单的代理 模式 尽管简单 却有着很高的效率 以及 低耦合性


  • 相关阅读:
    Mysql 删除表
    Mysql 创建表
    Mysql left join
    Qt(Mac) 进程的启动
    Mysql update
    Mysql insert
    Mysql select
    Mysql INNER JOIN
    Mysql 别名
    Mysql 排序
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5170576.html
Copyright © 2011-2022 走看看