浅谈协议和代理的使用

来源:互联网 发布:go vs python 编辑:程序博客网 时间:2024/06/05 02:36

从面向对象的思想来分析,协议的作用和Java中接口是一样的,都是为了实现多态,为了类之间的解耦合

我先谈一下,协议在OC中的作用

定义一个Dog和Cat类

@interface Dog : NSObject

-(void) makeASound;

@end

@implementation Dog

-(void)makeASound

{

   NSLog(@"旺旺");

}

@end


@interface Cat : NSObject

-(void) makeASound;

@end

@implementation Cat

-(void)makeASound

{

    NSLog(@"喵喵");

}

@end

如果我们调用Dog和Cat中的-(void)makeASound;方法

就需要分别定义一个对象

        Dog *dog = [[Dogalloc] init];

       Cat *cat = [[Catalloc] init];

        [dogmakeASound];

        [catmakeASound];

如果我们还要让羊、鸡等其他的动物叫,我们必须得定义其他动物的对象

这样做就太麻烦了


这时候我们就用到协议来帮助我们了

我们定义一个协议,-(void)MakeASoundDelegate;写到协议中

@protocol MakeASoundDelegate <NSObject>

-(void)MakeASoundDelegate;

@end


然后让可以叫得动物都实现这个协议

@interface Dog : NSObject <MakeASoundDelegate>

@end


@interface Cat : NSObject <MakeASoundDelegate>

@end

这样我们就可以这样调用

id <MakeASoundDelegate> animal;

animal可以指向所有实现了该协议的对象

animal = [Dog makeASound];

这样就实现了动态绑定实现了多态

调用一种方法可以得到不同的行为


代理协议总是在一块使用,但不要把它们混为一体

协议的作用就是为了实现多态

代理就是一种设计模式

没有协议照样可以写出代理


下面以人下载东西的例子介绍一下代理的使用


人下载东西这件事的目的就是存储下载的内容

显然下载器下载文件,然后存储文件,对于存储文件这件事,下载器不需要做,因为每个人下载的东西都不一样,如果让下载器存储的话,那下载器的负载就大了去了,

这时候就用到了代理模式,下载器只负责下载,不去存储,让下载东西的人去存储,下载的人去代理这件事情


并不是只有人可以代理存储文件这件事情,凡是给下载器发送地址的都可以去代理存储文件这件事情,这样我们就得用到协议了

@protocol DownloadDelegate <NSObject>

// 规定接受数据的接口

- (void)messageWithDownload:(NSString *)message;

@end




@interface Person :NSObject<DownloadDelegate>

// 属性存储下载到的数据

@property (nonatomic,copy)NSString *message;

// 开始下载

- (void)run;

@end

@implementation Person

- (void)run

{

    

    // 建立代理关系

   Download *download = [[Downloadalloc] init];

    

    download.delegate =self;



    [downloaddownloadWithpath:@"XXXXX"];

}

- (void)messageWithDownload:(NSString *)message

{

   self.message = message;

}

@end




@interface Download :NSObject

@property (nonatomic,weak)id<DownloadDelegate>delegate;


// 下载方法

- (void)downloadWithpath:(NSString *)path;

@end

@implementation Download


- (void)downloadWithpath:(NSString *)path

{

    printf("正在努力下载中。。。。\n");

    printf("正在努力下载中。。。。\n");

    printf("正在努力下载中。。。。\n");

    printf("正在努力下载中。。。。\n");

    

   sleep(2);

    

   NSString *str = [NSStringstringWithFormat:@"我是从%@,下载下来的",path];

    

    

    // delegete指向接受方

    [self.delegatemessageWithDownload:str];

    

}

@end



















0 0
原创粉丝点击