return this.memento;
}
/**
- 保存备忘录
*/
public void saveMemento(Memento memento){
this.memento = memento;
}
}
public class Client {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
//改变发起人对象的状态
originator.setState(“stateA”);
//创建备忘录对象,并将发起人对象的状态储存起来
caretaker.saveMemento(originator.createMemento());
//修改发起人的状态
originator.setState(“stateB”);
//恢复发起人对象的状态
originator.restoreMemento(caretaker.getMemento());
System.out.println(“恢复状态:”+originator.getState());
}
}
输出结果:
多状态的备忘录模式
上面的示例代码展示的情况比较简单,Originator中只有一个state成员变量需要保存,但实际中可能不止一个,会有很多个状态变量需要处理,那么在备份的时候就需要将所有的变量都存储起来,一种方法就是将变量名和对应的值都保存到一个map当中。当然还有比较简单的方法就是利用原型模式,我们可以将当前对象clone一个一模一样的对象来保存备份,通过clone的方式甚至都不需要备忘录管理者角色。下面是示例代码:
public class Originator implements Cloneable {
private Originator backup;
private String state;
private String state2;
private String state3;
/**
- 创建备份
*/
public void createMemento() {
try {
this.backup = this.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
/**
- 恢复备份
*/
public void restoreMemento(){
this.setState(this.backup.getState());
this.setState2(this.backup.getState2());
this.setState3(this.backup.getState3());
}
@Override
protected Originator clone() throws CloneNotSupportedException {
return (Originator) super.clone();
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getState2() {
return state2;
}
public void setState2(String state2) {
this.state2 = state2;
}
public String getState3() {
return state3;
}
public void setState3(String state3) {
this.state3 = state3;
}
}
当然,我们知道通过clone的方式是有缺陷的,对象的复制都是浅拷贝,这样对于那些是对象类型的成员变量还是跟原来共享的不能完全的隔离。所以最好的方式应该是使用序列化(Serializable)来进行存储。
更安全的备忘录模式
作为备份的数据,是用作将来恢复系统使用的,所以必须保证数据的完整性、纯净性,不能随意被别人修改,否则就失去了作为备份的意义。那么我们就必须想办法不让别人能够去修改它,怎么做呢,这里可以备忘录通过实现一个标识接口(空接口)的办法来对外部进行隔离。示例代码:
public class Originator {
private String state;
/**
- 创建备份
*/
public IMemento createMemento(){
return new Memento(state);
}
/**
- 恢复备份
*/
public void restoreMemento(IMemento memento){
this.state = ((Memento) memento).getState();
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
System.out.println(“当前状态:” + this.state);
}
private class Memento implements IMemento {
private String state;
public Memento(String state){
this.state = state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
}
public interface IMemento {
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
学习福利
【Android 详细知识点思维脑图(技能树)】
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
详细整理在GitHub可以见;
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
[外链图片转存中…(img-sUzvugE1-1710692643515)]
详细整理在GitHub可以见;
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。