Object-C篇-设计模式之代理

一 : 代理设计模式简述

自己做不了的事情,教给别人帮你完成,并且,完成的那个结果返还给你.这个就是代理,举一个简单的小例子 : 假如足球明星C罗去参加一些商务活动,但是C罗所具有的能力只有足球踢得好,,有魅力这写,不会管安排酒店,安排飞机,安排安保,安排活动进程这些东西.这时候需要一个代理人,帮助C罗去完成这些琐事的东西,接下来看看,如何用代码实现这一场景.

二 : 代理设计模式应用场景

  • 当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)
  • 对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
  • 当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)

三 : 设计并书写C罗的代理

定义C罗最近想做的事情

@interface CRonaldo : NSObject

//relax
-(void)releax;

//电视演出
-(void)TVShow;

@end
@implementation CRonaldo
-(void)TVShow{
    NSLog(@"C罗进行节目录制");
}

-(void)releax{
    NSLog(@"C罗在夏威夷海滩和妻子吹风");
}
@end

需要一个人来帮助自己去安排一下出演,和假期但是C罗身份在那摆着呢,这种事情不能自己做,这里要安排一个助手也就是代理在这里.

@interface Assistant : NSObject

@end

定义一个协议,那种人才有资格当这个助手呢,简单一,具有安排演出和安排假期能力的人能当上这个助手,定义一个协议,协议内容为安排假期和安排演出

@protocol AssistantProtocol 
//安排演出
-(void)playTvShow;

//安排假期
-(void)playHoliday;
@end

让我们助手遵守这些协议

#import "AssistantProtocol.h"

@interface Assistant : NSObject

@end

@implementation Assistant
-(void)playTvShow{
    NSLog(@"预定飞机票");
    NSLog(@"排除车子");
    
    
    
}

- (void)playHoliday{
    NSLog(@"安排假期时间");
    NSLog(@"准备旅行用品,和居住酒店")
    
    
}

助手的条件,现在已经搞定了,我们现在去给C罗安排这么一个人来做这些事情

@interface CRonaldo : NSObject

//relax
-(void)releax;


//电视演出
-(void)TVShow;

@property(nonatomic,weak)id assisDegate;

@end
#import "CRonaldo.h"

@implementation CRonaldo
-(void)TVShow{
    if ([self.assisDegate respondsToSelector:@selector(playTvShow)] ) {
        [self.assisDegate playTvShow];
    }
    NSLog(@"C罗进行节目录制");
}

-(void)releax{
    if ([self.assisDegate respondsToSelector:@selector(playHoliday)] ) {
        [self.assisDegate playHoliday];
    }
    NSLog(@"C罗在夏威夷海滩和妻子吹风");
}

到现在为止呢,安排等琐碎的小事就算安排出去了,毕竟大明星都有自己的助理,接下来测试一下

 //创建助手一位
    Assistant *assis = [[Assistant alloc]init];
    
    //请出我们的球星C罗
    CRonaldo *ron = [[CRonaldo alloc]init];
    
    //给C罗安排助手
    ron.assisDegate = assis;
    
    //协助C罗完成 度假 和 演出
    [ron TVShow];
    [ron releax];

打印结果


打印结果

四 : 实际开发中的代理

  • 一般情况下, 当前协议属于谁, 我们就将协议定义到谁的头文件中

  • 协议的名称一般以它属于的那个类的类名开头, 后面跟上protocol或者delegate

  • 协议中的方法名称一般以协议的名称protocol之前的作为开头

  • 一般情况下协议中的方法会将触发该协议的对象传递出去

  • 一般情况下一个类中的代理属于的名称叫做 delegate

我们根据这些小小的建议在来修改一下C罗助手的书写方式

#import 
@protocol AssistantProtocol ;
//安排演出
-(void)playTvShow;

//安排假期
-(void)playHoliday;

@end


@interface CRonaldo : NSObject

//relax
-(void)releax;


//电视演出
-(void)TVShow;

@property(nonatomic,weak)id assisDegate;

@end

你可能感兴趣的:(Object-C篇-设计模式之代理)