OC基础——代理模式(delegate)

本文探讨了代理模式在Objective-C中的应用,强调了代理模式通过遵守协议实现低耦合,并以小明委托小强买电影票为例,详细解释了协议在代理中的作用,展示了如何通过协议来定义和约束代理职责。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



1、代理模式之我解
定义:为其它对象提供一种代理以用来控制这个对象,我们不需要关心代理是如何完成的,只关心代理有没有完成。
在看完李明杰老师的课程后,我对代理也有了一个初步的了解,虽然很浅显,但是也明白了代理模式的一些作用跟方法。
举个例子来说:有一个人A,他本身不会自己做饭和做家务等一些事情,于是A就请了一个保姆,于是A与保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人。即A与保姆之间有个协议,保姆继承改协议,于是保姆就需要实现该协议中的条款成为代理人。
2、代理模式的关键点:
A想完成一件事,但是自己不能完成,于是他找个代理人B替他完成这个事情,他们之间便有个协议(protocal),B继承该协议来完成A代理给他的事情。

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

 3、优点:耦合性较低,增加了代码的弹性。代理和对象之间互不影响。      

  举例说明:小明想看电影,但是没时间买票,于是小明就委托小强去买票,去之前他很小强签订了一份买票协议TickProtocol,明确告知小强询问票价和剩余票数。
于是便有了下面的故事:

// 协议TickProtocol.h
#import <Foundation/Foundation.h>
@protocol TickProtocol <NSObject>
- (int)PriceTick; // 声明询问票价格的方法
- (int)LeftTick; // 声明剩余票数的方法
@end

//代理Agent.h文件
#import <Foundation/Foundation.h>
@protocol TickProtocol; // 在代理头文件中声明有TickProtocol协议
@interface Agent : NSObject<TickProtocol> // 代理必须遵守这份协议
@end

// 代理Agent.m文件
#import "Agent.h"
#import "TickProtocol.h"

@implementation Agent
// 实现协议中的询问票的价格
- (int)PriceTick
{
    return 80;
}
// 实现协议中的查看剩余票的方法
- (int)LeftTick
{
    return  1;
}
@end

//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 文件
#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;
}
通过上面的故事我们可以知道,有了代理后,Person不需要自己跑到电影院就可以买到票和票的剩余数了。Person也不关心Agent是怎么得到票的价格和剩余数的,Person只想得到结果,并不想知道得到结果的过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值