Delegate 代理

2020-06-24  本文已影响0人  借缕春风绽百花

什么是代理?

代理类似于生活中的中介机构,当某人有一个租房买房等需求时,某人找到中介,告诉中介自己的身份和联系方式,然后让中介执行他的租房买房能力,中介将房子找好以后,通过之前记录的雇主信息找到雇主,将找到的房子交给雇主。这样的流程就叫代理。

代理的使用

这里我们以一个人去租房为例
1.创建一个Person类用于调用代理即中介去租房,该类有一个向中介发起租房任务的方法needHouse和一个接收中介返回房子信息的方法receiveHouse

-(void)needHouse{
    
}
-(void)receiveHouse:(NSString *)house{
    
}

2.创建一个代理类Agent,用于充当代理去实现租房需求,该类有一个租房的方法rentHouse和一个Person类对象p,p用于记录调用该代理得人。

@property (nonatomic,strong)Person *p;
-(void)rentHouse{
   
    
}

3.在Person类中实现对代理类的调用

-(void)needHouse{
    //1.找到中介
    Agent *agent = [Agent new];
    //2.告诉中介我是谁
    agent.p = self;
    //3.让中介去租房子
    [agent rentHouse];
    
}

4.在Person类中实现接收中介返回信息的方法receiveHouse

-(void)receiveHouse:(NSString *)house{
    NSLog(@"接收到房子%@了",house);
}

5.在Agent类中实现rentHouse方法,并把结果通过调用Person的接收方法receiveHose返回给调用者。

-(void)rentHouse{
    NSLog(@"正在找房。。。。。。。。。。。。。");
    //返回数据给雇主
    [self.p receiveHouse:@"湖畔之梦小区"];
    
}

6.在主函数main中导入Person类,并发起租房。

 //1.实例化Person类
        Person *zwf = [Person new];
        //2.调用Person类的租房方法
        [zwf needHouse];

7.运行结果


加入协议

上文中,单个随想调用代理比较方便,可代理不是为一个对象服务,当多个对象都要调用代理时,为应对每个对象的,代理需要调用不同的结果返回方法将处理结果返回给调用方。这里就引入了协议概念,每个对象要调用中介,都要遵循代理规定的协议,使用协议规定的接收方法接收代理返回值。
1.在Agent内制定一个协议,该协议内有一个接收数据的方法;声明一个遵循协议的任意对象类型属性变量用于接收雇主信息。为了保证调用者在遵守协议却没有实现协议而导致的运行时程序崩溃的问题,在代理实现文件中加上判断调用者是否实现了协议所需的方法,若实现了再返回数据给调用者。

@protocol rentHouseProtocol <NSObject>
//返回房子给雇主的方法
-(void)ceceiveHouse;

@end

@interface Agent : NSObject
//声明一个属性变量用于记录雇主,该变量可以使任何遵循rentHousePrococol协议的对象类型
@property (nonatomic,assign)id<rentHouseProtocol> emplyer;
//租房方法
-(void)rentHouse;

@end

实现文件内

-(void)rentHouse{
    NSLog(@"正在找房。。。。。。。。。。。。。");
    //返回数据给雇主
    if([self.emplyer respondsToSelector:@selector(receiveHouse:)]){
        [self.emplyer receiveHouse:@"湖畔之梦小区"];
    }
    
    
}

2.在Person类中实现协议方法,并实现租房请求。

-(void)needHouse{
    //1.找到中介
    Agent *agent = [Agent new];
    //2.告诉中介我是谁
    agent.emplyer= self;
    //3.让中介去租房子
    [agent rentHouse];
    
}

- (void)receiveHouse:(nonnull NSString *)house {
    NSLog(@"接收到房子%@了",house);
}

3.在主函数实例化Person对象并发起租房请求

 //1.实例化Person类
        Person *zwf = [Person new];
        //2.调用Person类的租房方法
        [zwf needHouse];

4.上述步骤只是实现了单个对象调用代理的需求,接下来,我们再写一个Dog类,同样通过代理调用租房。在该类中同样的遵循该协议并声明租房方法。

@interface Dog : NSObject<rentHouseDelegate>

-(void)needHouse;

@end

5.在该类实现文件中实现租房请求方法和协议中的接收方法。

-(void)needHouse{
    //1.找到中介
    Agent *agent = [Agent new];
    //2.告诉中介我是谁
    agent.emplyer= self;
    //3.让中介去租房子
    [agent rentHouse];
}
- (void)receiveHouse:(nonnull NSString *)house {
    NSLog(@"dog接收到房子%@了",house);
}

6.同样的,在main函数中实例化Dog类对象并发出租房申请

Dog *dog = [Dog new];
        [dog needHouse];

7.运行结果


注意事项

1.为了防止雇主类和代理类相互引用导致循环引用,建议雇主类和代理类头文件均使用@class前项引用。

上一篇 下一篇

猜你喜欢

热点阅读