Java备忘录模式(Memento)

网友投稿 655 2022-05-30

本文我们来介绍下java23种设计模式中的备忘录模式。

备忘录模式Memento

使用场景

录入大批人员资料。正在录入当前人资料时,发现上一个人录错了,

此时需要恢复上一个人的资料,再进行修改。

Word文档编辑时,忽然电脑死机或断电,再打开时,可以看到word

提示你恢复到以前的文档

管理系统中,公文撤回功能。公文发送出去后,想撤回来

核心内容

就是保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态

类图

具体实现

负责人类

/** * 负责人类 * 负责管理备忘录对象 * @author 波波烤鸭 * @email dengpbs@163.com * */ public class CareTaker { private EmpMemento memento; //备忘点较多时,将备忘录压栈,将多个备忘录对象,序列化和持久化 实现撤回多步的操作 // private Stack stack = new Stack(); // private List list = new ArrayList(); public EmpMemento getMemento() { return memento; } public void setMemento(EmpMemento memento) { this.memento = memento; } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

源发起类

/** * 源发器类 * @author 波波烤鸭 * @email dengpbs@163.com * */ public class Emp { private String ename; private int age; private double salary; //进行备忘操作,并返回备忘录对象 public EmpMemento memento(){ return new EmpMemento(this); } //进行数据恢复,恢复成制定备忘录对象的值 public void recovery(EmpMemento mmt){ this.ename = mmt.getEname(); this.age = mmt.getAge(); this.salary = mmt.getSalary(); } public Emp(String ename, int age, double salary) { super(); this.ename = ename; this.age = age; this.salary = salary; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } }

1

2

3

4

5

6

7

8

9

10

11

12

13

Java备忘录模式(Memento)

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

备忘录类

/** * 备忘录类 * @author 波波烤鸭 * @email dengpbs@163.com * */ public class EmpMemento { private String ename; private int age; private double salary; public EmpMemento(Emp e) { this.ename = e.getEname(); this.age = e.getAge(); this.salary = e.getSalary(); } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } }

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

测试类

public static void main(String[] args) { CareTaker taker = new CareTaker(); Emp emp = new Emp("bobo烤鸭", 18, 880); System.out.println("第一次打印对象:"+emp.getEname()+"---"+emp.getAge()+"---"+emp.getSalary()); taker.setMemento(emp.memento()); //备忘一次 emp.setAge(28); emp.setEname("dpb"); emp.setSalary(19000); System.out.println("第二次打印对象:"+emp.getEname()+"---"+emp.getAge()+"---"+emp.getSalary()); emp.recovery(taker.getMemento()); //恢复到备忘录对象保存的状态 System.out.println("第三次打印对象:"+emp.getEname()+"---"+emp.getAge()+"---"+emp.getSalary()); }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

输出

第一次打印对象:bobo烤鸭---18---880.0 第二次打印对象:dpb---28---19000.0 第三次打印对象:bobo烤鸭---18---880.0

1

2

3

撤回成功~~

开发中常见的应用场景:

棋类游戏中的,悔棋

普通软件中的,撤销操作

数据库软件中的,事务管理中的,回滚操作

Photoshop软件中的,历史记录

Java

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【Emmet Zen Coding——HTML / CSS】 超实用开发技巧
下一篇:【Flutter】Dart 面向对象 ( get 方法 | set 方法 | 静态方法 )
相关文章