代理模式
定义
代理模式(Proxy Pattern
) :给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy
或Surrogate
,它是一种对象结构型模式
类图
代理模式委托类
//.h
@protocol PersonDelegate <NSObject>
@required
- (void)eat:(int)clock;
- (void)run:(int)clock;
@end
@interface Person : NSObject
- (instancetype)initWithName:(NSString *)name;
@property (nonatomic, strong) id<PersonDelegate> deleagte;
- (void)wantToEatDinner:(int)clock;
- (void)wantToRun:(int)clock;
@end
//==================
//.m
@interface Person()
@property (nonatomic, copy) NSString *name;
@end
@implementation Person
- (instancetype)initWithName:(NSString *)name {
if (self == [super init]) {
self.name = name;
}
return self;
}
- (void)wantToEatDinner:(int)clock{
NSLog(@"%@想%d出去吃饭",self.name,clock);
if ([self.deleagte respondsToSelector:@selector(eat:)]) {
[self.deleagte eat:clock];
}
}
- (void)wantToRun:(int)clock{
NSLog(@"%@想%d出去跑步",self.name,clock);
if ([self.deleagte respondsToSelector:@selector(run:)]) {
[self.deleagte run:clock];
}
}
@end
代理类
//.h
@interface Proxy : NSObject<PersonDelegate>
@end
//====
//.m
- (void)eat:(int)clock {
NSLog(@"代理通知:%d点出去吃饭",clock);
}
- (void)run:(int)clock {
NSLog(@"代理通知:%d点出去跑步",clock);
}
client
- (void)viewDidLoad {
[super viewDidLoad];
Person *xiaoming = [[Person alloc] initWithName:@"小明"];
Proxy *xiaohong = [[Proxy alloc] init];
xiaoming.deleagte = xiaohong;
[xiaoming wantToRun:5];
}
使用场景
在iOS下面的使用场景一般有界面反向传值,tableView
的数据源,自定义cell
,cell
点击事件,系统通知,系统方法回调等等。。。
优点
- 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
- 远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
- 虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
- 保护代理可以控制对真实对象的使用权限。
缺点
- 由于在客户端和真实主题之间增加了代理对象,因此 有些类型的代理模式可能会造成请求的处理速度变慢。
- 实现代理模式需要额外的工作,有些代理模式的实现 非常复杂。
备忘录模式
定义
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
使用场景
在iOS下面的使用场景一般有界面反向传值,tableView
的数据源,自定义cell
,cell
点击事件,系统通知,系统方法回调等等。。。
类图
Memo.h
#import <Foundation/Foundation.h>
@interface Memo : NSObject
/// 示例属性 -- 年龄
@property (nonatomic) NSInteger age;
/// 示例属性 -- 身高
@property (nonatomic) NSInteger height;
//User.h
#import <Foundation/Foundation.h>
@class Memo;
@interface User : NSObject
/// 示例属性 -- 姓名
@property (nonatomic, strong) NSString *name;
/// 示例属性 -- 年龄
@property (nonatomic) NSInteger age;
/// 示例属性 -- 身高
@property (nonatomic) NSInteger height;
#pragma mark - method
/**
保存备忘录
*/
- (Memo *)saveState;
/**
从备忘录中恢复
*/
//=======
// User.m
#import "User.h"
#import "Memo.h"
@implementation User
- (Memo *)saveState {
Memo *m = [Memo new];
m.age = _age;
m.height = _height;
return m;
}
- (void)recoverStateFromMemo:(Memo *)memo {
_age = memo.age;
_height = memo.height;
}
@end
使用
User *user = [User new];
user.name = @"小明";
user.age = 20;
user.height = 178;
NSMutableArray *memoArray = [NSMutableArray array];
for (int i=0; i<10; i++) {
[memoArray addObject:[user saveState]];
user.age += 1;
user.height += 0.8;
}
/// 恢复到25岁时候的状态
[user recoverStateFromMemo:memoArray[5]];
用途
- 用于存储状态
优点
- 将被储存的状态放在外面,不要和关联对象混在一起,这可以帮助维护内聚
- 保持关联对象的数据封装
- 提供了容易实现的恢复能力
缺点
- 储存和恢复状态的过程可能相当耗时
网友评论