代理回调分析和OC实现

来源:互联网 发布:金山数据恢复会员共享 编辑:程序博客网 时间:2024/05/21 05:21

代理模式是一种很重要的设计模式,它的核心思想是通过代理接口分离使用者和服务提供者,降低了模块之间的耦合度。在实际中灵活使用代理模式可以让我们写出更优质的模块结构的代码。

那么代理模式具体是怎么样实现的呢?

举一个简单的例子:

用户在浏览器中点击一个文件链接(例如百度网盘的文件)想要下载这个文件,【浏览器此时会自动解析该地址的目标IP,然后往这个IP发送相应的GET请求,对方服务器做出响应返回文件】之后浏览器接收文件保存到用户的硬盘上,用户浏览下载好的文件。

解析:
这个例子中浏览器就是一个用户的代理,他帮助用户执行了中括号括起来的内容,而用户对代理做的事情毫不知情,也完全不关心,他们只关心下载了的文件。

使用UML图可以作如下表示:
这里写图片描述
整个过程就是:用户使用浏览器下载文件,接着浏览器使用事先定义的协议将下载好的文件保存在用户的硬盘上。

浏览器不限一种,只要能实现协议的浏览器,就就帮助用户下载并保存文件,体现出代理模式的优势。

OC实现代码

代理接口 MessageDeliver.h↓

#import <Foundation/Foundation.h>@protocol MessageDeliver <NSObject>- (void)sendMessageToPerson:(NSString *)message;@end

用户类Person.h↓

#import <Foundation/Foundation.h>#import "MessageDeliver.h"@interface Person : NSObject <MessageDeliver>@property (copy) NSString *file;- (void)startDL:(NSString *)path;@end

Person.m↓

#import "Person.h"#import "Downloader.h"@implementation Person- (void)startDL:(NSString *)path{    Downloader *downloader = [[Downloader alloc]init];    downloader.delegate = self;    [downloader downloadFile:path];}- (void)sendMessageToPerson:(NSString *)message{    self.file = message;}@end

浏览器类Downloader.h↓

#import <Foundation/Foundation.h>#import "MessageDeliver.h"@interface Downloader : NSObject@property id<MessageDeliver> delegate;- (void)downloadFile:(NSString *)path;@end

Downloader.m↓

#import "Downloader.h"@implementation Downloader- (void)downloadFile:(NSString *)path{    // 浏览器具体处理代码    NSLog(@"正在下载... ...");    [self.delegate sendMessageToPerson:[NSString stringWithString:path]];}@end

main.m↓

#import <Foundation/Foundation.h>#import "Person.h"#import "Downloader.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        Person *person= [[Person alloc]init];        [person startDL:@"下载链接"];        NSLog(@"%@", person.file);    }    return 0;}

以上。

0 0
原创粉丝点击