先贴代码有空来写内容。

备忘录1

 //简单的备忘录,只可以记录上一次修改前的状态,实现撤回一次的操作。
class Student{
private String name;
private String age;
private String gender;
//在Student类中直接设立一个Student实例,用于存储该类对象的上一个状态
private Student memento=null;
//构造函数就不啰嗦了
public Student(){}
public Student(String n,String a,String g){
name = n;
age = a;
gender = g;
}
//在调用可能改变类属性的函数时,要调用saveMemento以备份修改前的实例。
public void setName(String n){
saveMemento();
name = n;
}
public String getName(){
return name;
}
//和上面一样就不罗嗦了
public void setAge(String a){
saveMemento();
age = a;
}
public String getAge(){
return age;
}
public void setGender(String g){
saveMemento();
gender = g;
}
public String getGender(){
return gender;
}
//new 一个本类实例,用于备份当前实例
private void saveMemento(){
memento = new Student(this.name,this.age,this.gender);
}
//返回备份
public Student getMemento(){
return memento;
}
public String toString(){
return "name: "+name+" age: "+age+" gender: "+gender;
}
}

测试类

 public class Test{
public static void main(String[] args){
Student tom = new Student("Tom","16","m"); System.out.println("初始信息:"+tom);
//调用set函数,tom发生了改变
tom.setGender("f");
System.out.println("修改后信息:"+tom);
//tom回到改变前的状态
tom = tom.getMemento();
System.out.println("撤回到修改前:"+tom); System.out.println("初始信息:"+tom);
tom.setName("Jarry");
System.out.println("修改后信息:"+tom);
tom = tom.getMemento();
System.out.println("撤回到修改前:"+tom);
}
}

备忘录2

 //这个备忘录可以实现多次撤回。
import java.util.Stack;
class Student{
private String name;
private String age;
private String gender;
//在Student类中直接设立一个存储Student实例的栈,用于存储该类对象的备份
private Stack<Student> memento = null;
//构造函数就不啰嗦了
public Student(){}
public Student(String n,String a,String g){
name = n;
age = a;
gender = g;
memento = new Stack<Student>();
}
//在调用可能改变类属性的函数时,要调用saveMemento以备份修改前的实例。
public void setName(String n){
saveMemento();
name = n;
}
public String getName(){
return name;
}
//和上面一样就不罗嗦了
public void setAge(String a){
saveMemento();
age = a;
}
public String getAge(){
return age;
}
public void setGender(String g){
saveMemento();
gender = g;
}
public String getGender(){
return gender;
}
//将实例的当前状态push到备忘录中
private void saveMemento(){
memento.push(new Student(this.name,this.age,this.gender));
}
//这里不再返回一个新的Student,而是pop出备忘录中的实例,用它的属性给本this的属性赋值
public Student getMemento(){
Student preMemento = memento.pop();
name = preMemento.getName();
age = preMemento.getAge();
gender = preMemento.getGender();
return this;
}
public String toString(){
return "name: "+name+" age: "+age+" gender: "+gender;
}
}

测试类

public class Test{
public static void main(String[] args){
Student tom = new Student("Tom","16","m"); System.out.println("初始信息:"+tom);
//调用set函数,tom发生了改变
tom.setGender("f");
System.out.println("修改后信息:"+tom);
tom.setName("Jarry");
System.out.println("修改后信息:"+tom);
tom.setAge("17");
System.out.println("修改后信息:"+tom);
tom.setName("haha");
System.out.println("修改后信息:"+tom);
//tom回到改变前的状态
System.out.println("撤回到修改前:"+tom.getMemento());
System.out.println("撤回到修改前:"+tom.getMemento());
System.out.println("撤回到修改前:"+tom.getMemento());
System.out.println("撤回到修改前:"+tom.getMemento());
}
}

memento3

设计模式03备忘录(java)的更多相关文章

  1. 折腾Java设计模式之备忘录模式

    原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...

  2. 23种设计模式全解析 (java版本)

    转自:http://blog.csdn.net/longyulu/article/details/9159589 其中PHP常用的五种设计模式分别为:工厂模式,单例模式,观察者模式,策略模式,命令模式 ...

  3. 设计模式:备忘录(Memento)模式

    设计模式:备忘录(Memento)模式 一.前言   备忘录模式用于保存和恢复对象的状态,相信大家看过我前面的拙作就会想到原型模式也能保存一个对象在某一个时刻的状态,那么两者有何不同的呢?原型模式保存 ...

  4. 北风设计模式课程---备忘录(Memento)模式

    北风设计模式课程---备忘录(Memento)模式 一.总结 一句话总结: 备忘录模式也是一种比较常用的模式用来保存对象的部分用于恢复的信息,和原型模式有着本质的区别,广泛运用在快照功能之中.同样的使 ...

  5. 从设计模式说起JAVA I/O流

    从设计模式说起JAVA I/O流 之前写过一篇I/O流的入门介绍,直到最近看了设计模式,顺带理下I/O流的设计思路. JAVA类库中的I/O类分成输入和输出两部分,通过继承,任何自InputStrea ...

  6. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

    原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...

  7. C#设计模式:备忘录模式(Memento Pattern)

    一,C#设计模式:备忘录模式(Memento Pattern) 1.发起人角色(Originator):记录当前时刻的内部状态,负责创建和恢复备忘录数据.负责创建一个备忘录Memento,用以记录当前 ...

  8. js设计模式——7.备忘录模式

    js设计模式——7.备忘录模式 /*js设计模式——备忘录模式*/ // 备忘类 class Memento { constructor(content) { this.content = conte ...

  9. [译]Java 设计模式之备忘录

    (文章翻译来自Java Design Pattern: Memento) memento是一个保存另外一个对象内部状态拷贝的对象.这样以后就可以将该对象恢复到原先保存的状态. 在将来时空旅行将成为显示 ...

随机推荐

  1. APEX:对object中数据进行简单处理?

    在Salesforce中,常常要对各种数据进行处理,已满足业务逻辑.本篇文章会介绍如何实现从object获取数据,然后将取得的数据进行一系列简单处理. 第一步:SongName__c 是一个新建的ob ...

  2. CSS三个定位——常规、浮动、绝对定位

    .dage { width: 868px; background: #5B8C75; border: 10px solid #A08C5A; margin-top: -125px; margin-le ...

  3. win10上部署Hadoop-2.7.3——非Cygwin、非虚拟机

    开始接触Hadoop,听人说一般都是在Lunix下部署Hadoop,但是本人Lunix不是很了解,所以Google以下如何在Win10下安装Hadoop(之后再在Lunix下弄),找到不少文章,以下是 ...

  4. 真正的汉化-PowerDesigner 16.5 汉化

    一.背景 经常使用PowerDesigner,之前使用15版本,后来16出来后,就一直在使用16,不过一直是英文.一些同事对使用英文版总显示有些吃力. 遍寻百度.必应,都没有找到真正的针对版本16的汉 ...

  5. Atitit.attilax软件研发与项目管理之道

    Atitit.attilax软件研发与项目管理之道 1. 前言4 2. 鸣谢4 3. Genesis 创世记4 4. 软件发展史4 5. 箴言4 6. 使徒行传 4 7. attilax书 4 8. ...

  6. 录像时调用MediaRecorder的start()时发生start failed: -19错误

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  7. C#开源实现MJPEG流传输

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 许久以前写了篇文章<基于.NET打造IP智能网络视频监控系统>,记录和介绍了自己几年来积 ...

  8. egret GUI 和 egret Wing 是我看到h5 最渣的设计

    一个抄袭FlexLite抄的连自己思想都没有,别人精髓都不懂的垃圾框架.也不学学MornUI,好歹有点自己想法. 先来个最小可用集合吧: 1. egret create legogame --type ...

  9. 一个小型的CMS后台管理平台发布啦~

    由于我不太懂怎么把博客园里我上传的文件共享,所以只好先放到百度网盘里了 数据库和发布的网站都放在这里 http://pan.baidu.com/s/1eQw3DOA 有问题请参考以下链接: http: ...

  10. ADO.NET 核心对象简介

    ADO.NET是.NET中一组用于和数据源进行交互的面向对象类库,提供了数据访问的高层接口. ADO.NOT类库在System.Data命名空间内,根据我们访问的不同数据库选择命名空间,System. ...