黑马程序员——OC语言之代理模式

本文通过一个买电影票的例子,介绍了代理模式的基本概念、实现方式及其优势。代理模式通过为其他对象提供代理来控制对象的行为,降低了类间的耦合度。
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
 1. 定义:
    为其它对象提供一种代理以用来控制这个对象,我们不关心代理如何完成的,只关心代理有没有完成。
     例如:小明想吃饭了,但是自己又不想做饭,所以他请了个保姆,为了保证自己的权益和家里安全,所以小明跟保姆签了一份协议,这份协议中声明了保姆只能做什么事情,比如说协议中声明了保姆只能做饭、洗碗、扫地等,保姆需要遵守协议,如果保姆不遵守这份协议,小明就可以另外换一个保姆。所以保姆就是代理,代理必须遵守某个协议,如果代理不遵守这个协议,它就不能成为某个对象的代理。

   条件:如果要成为代理,则必须遵守某个协议协议用于声明方法,限制代理必须拥有某个方法)。

   作用:可以监听某个方法是否被触发。

   优点:耦合性较低,增加了代码的弹性。
      例如代理被删除了,但是Person还在。代理和对象之间互不影响。

2.事例
   一个人Peron想要带女朋友去看电影,但是他又不想去电影院买票,因此他要找中介买票,或者要别人帮他去买,所以他找了一个代理,当然他跟代理签了一份协议,协议名为TickProtocol这份协议主要是说明要代理帮他问问票的价格和票的剩余数量。
           协议TickProtocol.h文件如下:用来声明代理需要做什么事情   
#import <Foundation/Foundation.h>
@protocol TickProtocol <NSObject>
- (int)PriceTick; // 声明询问票价格的方法
- (int)LeftTick; // 声明剩余票数的方法
@end</span>
          代理Agent.h文件如下:
#import <Foundation/Foundation.h>
@protocol TickProtocol; // 在代理头文件中声明有TickProtocol协议
@interface Agent : NSObject<TickProtocol> // 代理必须遵守这份协议

@end</span>
          代理Agent.m文件如下:
#import "Agent.h"
#import "TickProtocol.h"

@implementation Agent
// 实现协议中的询问票的价格
- (int)PriceTick
{
    return 30;
}
// 实现协议中的查看剩余票的方法
- (int)LeftTick
{
    return  15;
}
@end
</span>
    人Person.h文件如下:
#import <Foundation/Foundation.h>
@class Agent; // 声明有Agent类
@protocol TickProtocol; // 声明有TickProtocol协议
@interface Person : NSObject
// 声明买票方法
- (void)Buy;
// 声明一个代理
@property (nonatomic,retain)id<TickProtocol> DeleAgent; // 代理属性DeleAgent遵守协议TickProtocol
@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);
}
@end

  主文件main.m文件如下:
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Agent.h"
#import "Agent2.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;
}

     打印结果是:
price = 30,leftTick = 15。</span>
   如果我们把代理删掉,Person还是在,Person可以另外找个代理2询问电影票的价格和剩余数,也就是说如果代理挂掉了也完全不会影响到Person买电影票的情况。  
  有了代理后,Person不需要自己跑到电影院就可以买到票和票的剩余数了。Person也不关心Agent是怎么得到票的价格和剩余数的,Person只想得到结果,并不想知道得到结果的过程。
   总结:使用代理的最大好处就是类与类之间的耦合性降低了,我们可以针对Person或Agent增加另外的方法和成员变量,不需要考虑增加后是否对另外的类造成影响,增加了程序的弹性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值