代理模式的定义:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
UML示意图
代理与协议的区别:
代理原理:代码示例
裁判需要知道r跑了多远的信息.
创建Person类
Person.h
// 裁判要知道你得多快
#import <Foundation/Foundation.h>
@class Person;
@protocol PersonDelegate <NSObject>
- (void)person:(Person *)person run:(NSInteger)speed;
@end
@interface Person : NSObject
@property (nonatomic, weak) id<PersonDelegate> delegate;
- (void)run:(NSInteger)speed;
@end
Person.m
#import "Person.h"
@implementation Person
- (void)run:(NSInteger)speed {
if (self.delegate && [self.delegate respondsToSelector:@selector(person:run:)]) {
[self.delegate person:self run:speed];
}
}
@end
ViewController
#import "ViewController.h"
#import "Person.h"
@interface ViewController () <PersonDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person *per = [Person new];
per.delegate = self;
[per run:50];
}
- (void)person:(Person *)person run:(NSInteger)speed {
NSLog(@"run = %ld",speed);
}
@end
协议:1.用来规范接口 2.筛选传入对象
创建协议类DataProtocol
DataProtocol.h
#import <Foundation/Foundation.h>
@protocol DataProtocol <NSObject>
- (NSInteger)dataSouce1;
- (NSInteger)dataSouce2;
@end
创建Model文件
Model.h
#import <Foundation/Foundation.h>
#import "DataProtocol.h"
@interface Model : NSObject<DataProtocol>
@end
必须要遵守协议,实现协议中的方法
Model.m
#import "Model.h"
@implementation Model
- (NSInteger)dataSouce1{
return 0;
}
- (NSInteger)dataSouce2{
return 0;
}
@end
ViewController
#import "ViewController.h"
#import "Person.h"
#import "DataProtocol.h"
#import "Model.h"
@interface ViewController () <PersonDelegate, DataProtocol>
@property (nonatomic, assign) NSInteger num;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
//这里必须使用遵守了DataProtocol协议的model
- (void)testData:(id <DataProtocol>)model {
self.num = [model dataSouce1];
}
@end