OC之非正式协议总结

前言:

在OC中非正式协议用的不多。

1.Demo解释:

写了一个demo,就是老板要出差去上海,于是就会派遣员工去张罗着件事,买机票,买水和食物,还要处理走之前公司的事情。老板如果自己做,这些代码就要实现在自己的代码里面,但是如果把这些方法声明在协议里面,就减少了代码的耦合度,任何人都可以做这些事情,老板只需要指定某个实现该协议的人去做就ok了,随时可以裁员,换人。我们可以使用正式协议也可以使用非正式协议,这里我先写一个非正式协议的demo.

2.Demo结构及代码:

OC-非正式协议demo

main.m
#import <Foundation/Foundation.h>
#import "Boss.h"
#import "Employee1.h"
#import "Employee2.h"
#import "Employee3.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Boss *boss=[[Boss alloc] init];
        Employee1 *e1=[[Employee1 alloc] init];
        Employee2 *e2=[[Employee2 alloc] init];
        Employee3 *e3=[[Employee3 alloc] init];
        boss.delegate=e1;
        [boss buyTickets];//让员工1去买机票
        boss.delegate=e2;
        [boss buyWaterAndFoods];//让员工2去买食物和水
        boss.delegate=e3;
        [boss dealWithThings];//让员工3去处理老板走之前的事情

    }
    return 0;
}
Extension
NSObject_Prepare.h
//《Prepare协议》
// 注意1:非正式协议只用来扩展NSObject类,通常所说的OC中的扩展就是非正式协议
// 注意2:非正式协议中声明的方法是可选实现的,可以只实现一部分
// 注意3:非正式协议使用委托的时候只需要将委托的类型声明成id类型就可以了,不用声明具体遵守哪一个协议
// 委托对象的类.h文件中只需要导入协议文件,然后在自己的.m文件中实现需要实现的方法就可以了,不用再次声明了
#import <Foundation/Foundation.h>

@interface NSObject ()
//在Employee1中只实现了前两个方法,第三个方法没有实现
-(void)buyTickets;
-(void)buyWaterAndFoods;
-(void)culPrices;
@end
NSObject_Deal.h
//《Deal协议》
#import <Foundation/Foundation.h>

@interface NSObject ()
-(void)dealWithThings;//处理事情的方法
@end
Interface
Boss.h
#import <Foundation/Foundation.h>
#import "NSObject_Prepare.h"//导入协议
#import "NSObject_Deal.h"//导入协议
@interface Boss : NSObject
@property(nonatomic,assign)id delegate;//非正式协议委托人
-(void)gotoShangHai;
@end
Boss.m
#import "Boss.h"
@implementation Boss
-(void)gotoShangHai{
    NSLog(@"我要去上海开会");
}
#pragma mark - NSObject_Prepare协议
-(void)buyTickets{
//    NSLog(@"我自己买了往返机票");//原来需要自己去做的事情,接下来要交给委托人去做
    if ([_delegate respondsToSelector:@selector(buyTickets)]) {
        [_delegate buyTickets];//调用委托对象的买票方法
    }
}
-(void)buyWaterAndFoods{
//    NSLog(@"我自己买了水和食物");//原来需要自己去做的事情,接下来要交给委托人去做
    if ([_delegate respondsToSelector:@selector(buyWaterAndFoods)]) {
        [_delegate buyWaterAndFoods];//调用委托对象的买票方法
    }
}
#pragma mark - NSObject_Deal协议
-(void)dealWithThings{
//    NSLog(@"我得在走之前把要处理的事情都处理好");//原来需要自己去做的事情,接下来要交给委托人去做
    if ([_delegate respondsToSelector:@selector(dealWithThings)]) {
        [_delegate dealWithThings];//调用委托对象的处理事情方法
    }
}
@end
Employee1.h
#import <Foundation/Foundation.h>
#import "NSObject_Prepare.h"//步骤1
@interface Employee1 : NSObject
@end
Employee1.m
#import "Employee1.h"
@implementation Employee1
//步骤2 只要在这里实现buyTickets方法就可以
-(void)buyTickets{
    NSLog(@"我是员工1,我负责买往返机票");
}
@end
Employee2.h
#import <Foundation/Foundation.h>
#import "NSObject_Prepare.h"//步骤1 导入协议
@interface Employee2 : NSObject
@end
Employee2.m
#import "Employee2.h"
@implementation Employee2
//步骤2 实现协议中的方法
-(void)buyWaterAndFoods{
    NSLog(@"我是员工2,我负责买食物和水");
}
@end
Employee3.h
#import <Foundation/Foundation.h>
#import "NSObject_Deal.h"//步骤1 导入协议
@interface Employee3 : NSObject
@end
Employee3.m
#import "Employee3.h"
@implementation Employee3
//步骤2 实现方法
-(void)dealWithThings{
    NSLog(@"我是员工3,我负责处理老板走之前的事情");
}
@end

3.Demo运行结果:

这里写图片描述

总结:

非正式协议用的不多,因为如果是对类的扩充的话,可以使用类别category,虽然这样只能扩充方法不能扩充属性;如果是单纯把方法独立出来实现,完成多继承的功能,可以使用正式协议。
下一篇是OC中的正式协议。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章