资源

完全参照备忘录模式|菜鸟模式但不包括IOS代码

备忘录模式

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

介绍

意图: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
主要解决: 所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
何时使用: 很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。
如何解决: 通过一个备忘录类专门存储对象状态。
关键代码: 客户不与备忘录类耦合,与备忘录管理类耦合。
应用实例:
1、后悔药。
2、打游戏时的存档。
3、Windows 里的 ctri + z。
4、IE 中的后退。
4、数据库的事务管理。

优点:
1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
2、实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点: 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
使用场景:
1、需要保存/恢复数据的相关状态场景。
2、提供一个可回滚的操作。

注意事项:
1、为了符合迪米特原则,还要增加一个管理备忘录的类。
2、为了节约内存,可使用原型模式+备忘录模式。

Android

Memento.java

public class Memento {private String state;public Memento(String state){this.state = state;}public String getState(){return state;}
}

Originator.java

public class Originator {private String state;public void setState(String state){this.state = state;}public String getState(){return state;}public Memento saveStateToMemento(){return new Memento(state);}public void getStateFromMemento(Memento Memento){state = Memento.getState();}
}

CareTaker.java

import java.util.ArrayList;
import java.util.List;public class CareTaker {private List<Memento> mementoList = new ArrayList<Memento>();public void add(Memento state){mementoList.add(state);}public Memento get(int index){return mementoList.get(index);}
}

MementoPatternDemo.java

public class MementoPatternDemo {public static void main(String[] args) {Originator originator = new Originator();CareTaker careTaker = new CareTaker();originator.setState("State #1");originator.setState("State #2");careTaker.add(originator.saveStateToMemento());originator.setState("State #3");careTaker.add(originator.saveStateToMemento());originator.setState("State #4");System.out.println("Current State: " + originator.getState());    originator.getStateFromMemento(careTaker.get(0));System.out.println("First saved State: " + originator.getState());originator.getStateFromMemento(careTaker.get(1));System.out.println("Second saved State: " + originator.getState());}
}

结果

Current State: State #4
First saved State: State #2
Second saved State: State #3

IOS

Memento.h

#import <Foundation/Foundation.h>@interface Memento : NSObject
-(instancetype)initWithState:(NSString*)state;
-(NSString*)getState;
@end

Memento.m

#import "Memento.h"@interface Memento ()
@property (nonatomic,strong) NSString * state;
@end
@implementation Memento-(instancetype)initWithState:(NSString*)state{if(self = [super init]) {self.state = state;}return self;
}-(NSString*)getState{return self.state;
}
@end

Originator.h

#import <Foundation/Foundation.h>
#import "Memento.h"@interface Originator : NSObject
-(instancetype)initWithState:(NSString*)state;
-(void)setState:(NSString*)state;
-(NSString*)getState;
-(Memento*)saveStateToMemento;
-(void)getStateFromMemento:(Memento*)memento;
@end

Originator.m

#import "Originator.h"
@interface Originator ()
@property (nonatomic, strong) NSString* state;
@end@implementation Originator-(instancetype)initWithState:(NSString*)state{if(self = [super init]) {self.state = state;}return self;
}- (void)setState:(NSString *)state{_state = state;
}-(NSString*)getState{return self.state;
}-(Memento*)saveStateToMemento{return [[Memento alloc]initWithState:self.state];
}-(void)getStateFromMemento:(Memento*)memento{self.state = [memento getState];
}
@end

CareTaker.h

#import <Foundation/Foundation.h>
@class Memento;@interface CareTaker : NSObject
-(void)add:(Memento*)state;
-(Memento*)get:(int)index;
@end

CareTaker.m

#import "CareTaker.h"
#import "Memento.h"
@interface CareTaker()
@property (nonatomic, strong) NSMutableArray *mementoList;
@end@implementation CareTaker-(NSMutableArray*)mementoList{if(!_mementoList) {_mementoList = [[NSMutableArray alloc]init];}return _mementoList;
}-(void)add:(Memento*)state{
//    self.mementoList[self.mementoList addObject:state];
}
-(Memento*)get:(int)index{return [self.mementoList objectAtIndex:index];
}
@end

ViewController

Originator *originator = Originator.new;CareTaker *careTaker = CareTaker.new;[originator setState:@"State #1"];[originator setState:@"State #2"];[careTaker add:[originator saveStateToMemento]];[originator setState:@"State #3"];[careTaker add:[originator saveStateToMemento]];[originator setState:@"State #4"];NSLog(@"Current State: %@", [originator getState]);[originator getStateFromMemento:[careTaker get:0]];NSLog(@"First saved State: %@", [originator getState]);[originator getStateFromMemento:[careTaker get:1]];NSLog(@"Second saved State: %@", [originator getState]);

结果

 Current State: State #4First saved State: State #2Second saved State: State #3

移动开发之设计模式- 备忘录模式(IOSAndroid)相关推荐

  1. android加密备忘录开发,Android设计模式-备忘录模式

    1.定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 通俗来讲,备忘录模式就是一个对象的备份模式,提供一种程序数据的备份方 ...

  2. 移动开发之设计模式-工厂模式(IOSAndroid)

    资源 完全参照 工厂模式|菜鸟教程 ,但不包括IOS代码 工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对 ...

  3. 移动开发之设计模式- 解释器模式(IOSAndroid)

    资源 完全参照 解释器模式|菜鸟教程但不包括IOS代码 解释器模式 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接 ...

  4. 设计模式-备忘录模式(Memento)-Java

    设计模式-备忘录模式(Memento)-Java 目录 文章目录 1.前言 2.示例案例-可悔棋的中国象棋 3.备忘录模式概述 3.1.备忘录模式定义 3.2.备忘录模式结构 3.3.备忘录模式结构图 ...

  5. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  6. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  7. Java设计模式——备忘录模式

    Java设计模式--备忘录模式 需求 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状 ...

  8. C++设计模式——备忘录模式(memento pattern)

    博主看了许多文章和一些书,发现要么代码不全,要么对备忘录的理解有偏差,要么干脆根本就不是备忘录模式,经过博主查阅十余篇文章和详细研究书本备忘录模式,总结出这篇精华的c++备忘录模式文章,感兴趣的朋友可 ...

  9. 设计模式-备忘录模式(Memento)的详解

    介绍 关于Java设计模式我们都知道有一种备忘录模式,对于作用看名字大概就知道应该和状态保存有关.本文就从定义到示例代码进行说明详解. 定义 备忘录模式定义:在不破坏封装性的前提下,捕获对象的内部状态 ...

最新文章

  1. 织梦文章内容屏蔽替换词语多个敏感字词
  2. 自己写getElementsByClass()方法
  3. [DP] LGTB 玩THD (复杂状态DP)
  4. 数学建模资料分享群——2群
  5. sklearn 学习曲线Learning Curve和 validation_curve
  6. (转).gitignore详解
  7. 【51单片机快速入门指南】4.4.3:Madgwick AHRS 九轴姿态融合获取四元数、欧拉角
  8. 第七十六期:糟糕!服务器被植入挖矿木马,CPU飙升200%
  9. Linux shell 下的复制和粘贴(Copy Paste Operation on Linux shell)
  10. 苹果上新了!新款iPad Pro发布:妙控键盘成最大惊喜
  11. java员工表代码_基于java+ssh员工考勤管理系统源代码
  12. 工程量计算稿1.54安装教程 v1.54pjb
  13. 同一个服务器通过不同的端口设置不同的网站(IIS)
  14. c语言 函数拟合,曲线拟合成Y=a*(X^b)+c*(X^d)函数 - 数学 - 小木虫 - 学术 科研 互动社区...
  15. Python生成二维码的操作方法
  16. 【DeepExploit】基于强化学习的自动渗透工具
  17. jQuery实现购物车功能(小计、总计)
  18. 软件工程师解决测试人员测试出的bug流程
  19. Linux 操作必备 150 个快捷命令
  20. import ... from和import {} from 的区别

热门文章

  1. 关于stunnel的一些知识点
  2. Markdown 编辑器推荐
  3. 13个问题解密陈旭东的“神奇工场”
  4. JAVA编程你必须知道的那些英文单词
  5. xp系统查找哪台计算机,WinXP如何查看电脑使用记录?查看电脑使用痕迹的方法...
  6. R语言程序设计 week3
  7. easyui—DataGrid(数据表格)
  8. WebRTC进阶-SDP协议详解
  9. chrome 刷新快捷键
  10. android转场动画效果,Android转场动画