黑马程序员--OC学习笔记之代理模式的简单分析

来源:互联网 发布:东方财富软件打不开 编辑:程序博客网 时间:2024/05/01 14:20
代理模式概念
       传入的对象,代替当前类完成了某个功能,称为代理模式代理模式是在oc中经常遇到的一种设计模式,那什么叫做代理模式呢? 举个例子:有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情, 而保姆就是这个代理人,  即:婴儿和保姆之间有个协议,保姆继承该协议,于是保姆就需要实现该协议中的条款成为代理人。

利用协议实现代理模式的主要思路为():
       1)定义一个协议,里面声明代理类需要实现的方法列表, 比如这里一个代理类需要实现feedBaby与HongSleep方法
       2)创建一个代理类(比如BaoMu),遵守上面的代理协议
       3)在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议的成员变量
       4)在Baby类中调用成员变量_delegate(代理)的方法,调用代理类的方法
       5)main.m或其他使用Baby类的文件中,为Baby类的成员变量(代理类)赋值

下面看代码分析(一个经理不想自己去询问票价和剩余票数,于是找了一个助理,于是经理和助理之间商定了一个协议,协议中写明了助理需要做什么事情, 而助理就是这个代理人):

//首先声明一个助理需要遵守的一个协议
//声明一些跑腿的方法
TicketDelegate.h:
        # import <Foundation/Foundation.h>
        @protocol TicketDelegate <NSObject>  //必须遵守基协议 
        //返回票价
        - (double) ticketPrice;        
        //还剩多少张票
        - (int) leftTicketNumber;
        @end   

//让代理类遵守协议 并且实现应该实现的方法,这样我们就有了 一个可以代理协议 跟一个代理,另外,我们可以通过协议 实现更多的代理 Agent.h:
         # import <Foundation/Foundation.h>
        @protocol TickProtocol; // 在代理头文件中声明有TickProtocol协议
        @interface Person : NSObject <TicketDelegate>

        @end
//方法的实现
Agent.m:
        # import "Agent.h"
        #import "TickProtocol.h"
        @implementation Agent
        //返回票价
        - (double) ticketPrice
        {
                return 100;
        }       
        //还剩多少张票
        - (int) leftTicketNumber
        {
                return 66;
        }
        @end

//在person类中 _delegate这个变量代表着所使用的代理,要使用id类型, 但id类型必须要遵守协议才能使_delegate 能够使用协议中的方法
Person.h:
        #import <Foundation/Foundation.h>
        @class Agent;    // 声明有Agent类        
        @protocol TickProtocol;  // 声明有TickProtocol协议        
        
        @interface Person : NSObject             
        - (void)Buy;       // 声明买票方法          
        @property (nonatomic,retain) id<TickProtocol> DeleAgent;         // 声明一个代理,代理属性DeleAgent遵守协议  
        @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);     
        }       
        - (void) dealloc        
        {              
                [_delegate release];             
                [super dealloc];        
        }    
        @end
//编写main函数
main.m:     
        #import <Foundation/Foundation.h>
            #import "Person.h"     
        #import "Agent.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;
        }        
      如果我们把代理删掉,Person还是在,Person可以另外找个代理2询问电影票的价格和剩余数,也就是说如果代理挂掉了也完全不 会影响到Person买电影票的情况。  有了代理后,Person不需要自己跑到电影院就可以买到票和票的剩余数了。Person也不关心Agent 是怎么得到票的价格和剩余数的,Person只想得到结果,并不想知道得到结果的过程。      
      总结:使用代理的最大好处就是类与类之间的耦合性降低了,我们可以针对Person或Agent增加另外的方法和成员变量,不需要考虑增加后是否对另外的类造成影响,增加了程序的弹性。
0 0
原创粉丝点击