代理模式和备忘录模式

代理模式

定义

代理模式(Proxy Pattern) :给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做ProxySurrogate,它是一种对象结构型模式

类图

代理模式

委托类

//.h

@protocol PersonDelegate 

@required
- (void)eat:(int)clock;
- (void)run:(int)clock;

@end

@interface Person : NSObject

- (instancetype)initWithName:(NSString *)name;
@property (nonatomic, strong) id 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

@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的数据源,自定义cellcell点击事件,系统通知,系统方法回调等等。。。

优点

  • 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
  • 远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
  • 虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
  • 保护代理可以控制对真实对象的使用权限。

缺点

  • 由于在客户端和真实主题之间增加了代理对象,因此 有些类型的代理模式可能会造成请求的处理速度变慢。
  • 实现代理模式需要额外的工作,有些代理模式的实现 非常复杂。

备忘录模式

定义

在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

使用场景

在iOS下面的使用场景一般有界面反向传值,tableView的数据源,自定义cellcell点击事件,系统通知,系统方法回调等等。。。

类图

Memo.h

#import 

@interface Memo : NSObject

/// 示例属性 -- 年龄
@property (nonatomic) NSInteger age;

/// 示例属性 -- 身高
@property (nonatomic) NSInteger height;
//User.h

#import 

@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]];

用途

  • 用于存储状态

优点

  • 将被储存的状态放在外面,不要和关联对象混在一起,这可以帮助维护内聚
  • 保持关联对象的数据封装
  • 提供了容易实现的恢复能力

缺点

  • 储存和恢复状态的过程可能相当耗时

你可能感兴趣的:(代理模式和备忘录模式)