浅谈协议和代理的使用
来源:互联网 发布: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
- 浅谈协议和代理的使用
- Swift 协议代理的使用和传值
- iOS中代理协议的定义和使用
- 浅谈什么是正向代理和反向代理,如何使用nginx搭建正向代理和反向代理
- 浅谈Objective-C代理方案 &&浅谈Objective-C协议和委托
- iOS开发代理协议的使用
- OC学习--代理与协议的使用
- iOS 协议代理.block的基本使用
- 浅谈TCP和UDP对应的协议
- 协议和代理模式的概念
- iOS 协议代理的继承和扩展
- 协议和代理
- 协议和代理
- 协议和代理
- 协议和代理
- ios 协议和代理
- 协议和代理
- 代理和协议
- pdf阅读器官网
- Swift学习笔记之闭包
- 常用.bash_profile配置
- OC加强第一天--内存管理MRC、@property参数
- ios第三方库类
- 浅谈协议和代理的使用
- python chardet
- 二分查找
- qt http 下载文件
- JAVA 设计模式-单例模式
- HDU 1287 破译密码
- JVM调优参数参考文章——择其所需(精)
- J - 水果
- css 内边距 外边距 边框