协议(delegate)和代理模式

本文深入探讨了Objective-C中的协议(类似Java接口)及其应用,特别关注如何通过协议实现代理模式,使得一个对象能够替代另一个对象执行特定任务。通过自定义协议类、定义方法、实现协议以及利用代理模式,读者将掌握如何灵活地在Objective-C中利用协议来增强对象间的交互与功能复用。

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

所谓的协议(delegate)就和Java中的接口差不多,在里面只能进行一些方法的声明。

OC也是单继承多实现的,而"实现",就是通过delegate“实现”的。相比于Java,OC中的协议的好处是,协议可以指定其所定的方法是否为必须实现。

还有一个Java的特性在OC中也可以使用,就是类似泛型。

定义参数的时候就可以通过<>指定这里的参数只能传入实现特定协议的类。如下代码:

id <BoyFriendProtocol>_boyFriend;

在OC中,id表示任何类型,<>表示这里限定的协议是BoyFriendProtocol。只有实现了BoyFriendProtocol协议的类才能作为参数传递给_boyFriend实例变量。

具体编码步骤;

1 自定义协议类

新建类的时候,本来应该选择Object-c.class,新建协议要选择Object-c protocol,因为协议类只需要头文件,没有实现文件。

所谓的自定义类就是在新建类的代码上加上实现基础协议接口。

@protocol BoyFriendProtocol <NSObject>
2 定义方法

类实现好了,剩下的就是在接口中定义希望其他类实现的方法。在这里,@required表明是其他类必须实现的方法,@optional表明是其他类可选择性实现的方法。

@protocol BoyFriendProtocol <NSObject>
@required
//shopping
- (void)makeMoney;
@optional
//做饭
- (void)cook;
//有趣
- (void)funny;
//打扫卫生
- (void)clean;
@end

3 在类中实现该协议,并实现没有实现的方法。

实现的方法是在类中引入协议文件,然后注明是实现的该协议,然后再实现必须实现的方法,还有任意数量的可选实现方法

头文件部分

#import "BoyFriendProtocol.h"
@interface Boy : NSObject <BoyFriendProtocol>

.m实现部分

//shopping
- (void)makeMoney{
    NSLog(@"德胜门那");
}


//有趣
- (void)funny{
    NSLog(@"请不要叫我逗比,再叫我他喵的要揍人了");
}
//打扫卫生
- (void)clean{
    NSLog(@"搓衣板可以用来跪,也可以用来洗衣服");
}

以上就是协议(还是说成Java中接口比较好)的部分了,然后就是利用他的特性实现代理模式


所谓的代理模式,就是让别人去代替自己做东西呗。

实现,就是自定义一个协议,定义好方法,然后让别的类实现这个协议和对应的方法,然后将这个类作为实例变量传过来,去调用他对应的方法就是了

代码如下:

- (void)setBoyFriend:(id<BoyFriendProtocol>)boyFriend{
    _boyFriend = boyFriend;
}

//需求
- (void) wantEating{
    //判断是否实现给定方法
    //以后做代理的时候一定要加判断
    BOOL re = [[_boyFriend class] instancesRespondToSelector:@selector(cook:)];
    if(re){
       [_boyFriend cook];
    }else{
        NSLog(@"play go!!快,play go");
    }
}
值得一提的是在上面instancesRespondToSelector:方法。因为这里的方法调用的是通过selector进行搜索的,所有就存在后面传过去的方法名并不存在的可能性。这个时候运行就会报错崩溃。所以才会有上面的方法,作用是判断方法是否存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值