iOS设计模式之备忘录模式

189 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情


设计模式相信大家都很熟悉了,但是越是基础的东西也越是需要经常的回顾与思考,于是着手写一个温故而知新的设计模式回顾系列。
在 8 月,准备把各个常用的不常用的设计模式都进行一次回顾,并大概聊一下各个模式的特点与在 iOS 中的大概使用场景与情况。

这里是设计模式回顾的第五篇,备忘录模式的相关回顾。


备忘录模式

1、什么是备忘录模式

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

备忘录模式总共需要三种对象

  1. 保存对象(即备忘录)
  2. 使用对象
  3. 管理备忘录对象

保存对象是为了保存和恢复使用类的一些状态。管理对象是为了管理备忘录(例如多次恢复、根据版本恢复等)。

2、备忘录模式用在什么地方

  • 功能比较复杂的,但是需要维护或记录属性历史的类。
  • 需要保存的属性只是众多属性的一小部分时。

一般而言,运用备忘录的思想很多,完整的运用备忘录模式的很少。

3、备忘录模式的使用

  1. 在使用类中引用备忘录类,实现保存与恢复两个方法
  2. 通过管理对象,取出或者保存使用类需要的对象

管理对象可以是自定义类、也可以是数组或者字典。

4、总结

备忘录模式在许多的使用情况下,只有一个备忘录,就导致了一种管理类即是备忘录类的情况。只要每次都把外部备忘录对象进行覆盖和读取就可以实现备忘录模式。

5、demo

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;

/**
 从备忘录中恢复
 */
- (void)recoverStateFromMemo:(Memo *)memo;
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 = 18;
    user.height = 168;
    NSMutableArray *memoArray = [NSMutableArray array];
    for (int i=0; i<10; i++) {
        [memoArray addObject:[user saveState]];
        user.age += 1;
        user.height += 0.8;
    }
    /// 恢复到23岁时候的状态
    [user recoverStateFromMemo:memoArray[5]];