移动开发之设计模式- 备忘录模式(IOSAndroid)
资源
完全参照备忘录模式|菜鸟模式但不包括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)相关推荐
- android加密备忘录开发,Android设计模式-备忘录模式
1.定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 通俗来讲,备忘录模式就是一个对象的备份模式,提供一种程序数据的备份方 ...
- 移动开发之设计模式-工厂模式(IOSAndroid)
资源 完全参照 工厂模式|菜鸟教程 ,但不包括IOS代码 工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对 ...
- 移动开发之设计模式- 解释器模式(IOSAndroid)
资源 完全参照 解释器模式|菜鸟教程但不包括IOS代码 解释器模式 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接 ...
- 设计模式-备忘录模式(Memento)-Java
设计模式-备忘录模式(Memento)-Java 目录 文章目录 1.前言 2.示例案例-可悔棋的中国象棋 3.备忘录模式概述 3.1.备忘录模式定义 3.2.备忘录模式结构 3.3.备忘录模式结构图 ...
- Python设计模式-备忘录模式
Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...
- Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)
Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...
- Java设计模式——备忘录模式
Java设计模式--备忘录模式 需求 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状 ...
- C++设计模式——备忘录模式(memento pattern)
博主看了许多文章和一些书,发现要么代码不全,要么对备忘录的理解有偏差,要么干脆根本就不是备忘录模式,经过博主查阅十余篇文章和详细研究书本备忘录模式,总结出这篇精华的c++备忘录模式文章,感兴趣的朋友可 ...
- 设计模式-备忘录模式(Memento)的详解
介绍 关于Java设计模式我们都知道有一种备忘录模式,对于作用看名字大概就知道应该和状态保存有关.本文就从定义到示例代码进行说明详解. 定义 备忘录模式定义:在不破坏封装性的前提下,捕获对象的内部状态 ...
最新文章
- 织梦文章内容屏蔽替换词语多个敏感字词
- 自己写getElementsByClass()方法
- [DP] LGTB 玩THD (复杂状态DP)
- 数学建模资料分享群——2群
- sklearn 学习曲线Learning Curve和 validation_curve
- (转).gitignore详解
- 【51单片机快速入门指南】4.4.3:Madgwick AHRS 九轴姿态融合获取四元数、欧拉角
- 第七十六期:糟糕!服务器被植入挖矿木马,CPU飙升200%
- Linux shell 下的复制和粘贴(Copy Paste Operation on Linux shell)
- 苹果上新了!新款iPad Pro发布:妙控键盘成最大惊喜
- java员工表代码_基于java+ssh员工考勤管理系统源代码
- 工程量计算稿1.54安装教程 v1.54pjb
- 同一个服务器通过不同的端口设置不同的网站(IIS)
- c语言 函数拟合,曲线拟合成Y=a*(X^b)+c*(X^d)函数 - 数学 - 小木虫 - 学术 科研 互动社区...
- Python生成二维码的操作方法
- 【DeepExploit】基于强化学习的自动渗透工具
- jQuery实现购物车功能(小计、总计)
- 软件工程师解决测试人员测试出的bug流程
- Linux 操作必备 150 个快捷命令
- import ... from和import {} from 的区别