【Java设计模式】:行为型模式—备忘录模式
发布日期:2021-07-17 16:07:35
浏览次数:9
分类:技术文章
本文共 2964 字,大约阅读时间需要 9 分钟。
1. 场景
当我们使用文本编译器记录一些内容时,发现这一步写错了,往往可以使用Ctrl+Z的方式会退到上一个状态,其中运用到的知识就是备忘录模式。
2. 定义
备忘录模式,即保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态。
3. 模式结构
- 发起者角色(Originator):负责创建一个备忘录用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。
- 备忘录角色(Memento):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。
- 管理者角色(CareTake):负责保存好备忘录。
4. 代码示例
备忘录角色:
public class EmpMemento { private String name; private int age; private int salary; public EmpMemento(Emp emp){ this.name=emp.getName(); this.age=emp.getAge(); this.salary=emp.getSalary(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; }}
发起者角色:
public class Emp { private String name; private int age; private int salary; //进行备份操作,并返回一个备忘录对象 public EmpMemento memento(){ return new EmpMemento(this); } //进行数据恢复,恢复成备忘录中对象的值 public void recovery(EmpMemento em){ this.name=em.getName(); this.age=em.getAge(); this.salary=em.getSalary(); } public Emp(String name, int age, int salary) { this.name = name; this.age = age; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; }}
管理者角色:
/** * 管理者角色:负责管理备忘录类,示例只保存了一个备忘录对象,可以通过设置栈保存多个对象 */public class CareTaker { private EmpMemento memento; public EmpMemento getMemento() { return memento; } public void setMemento(EmpMemento memento) { this.memento = memento; }}
测试类:
public class Client { public static void main(String[] args) { CareTaker taker=new CareTaker(); Emp emp=new Emp("张三",18,2000); System.out.println("第一次打印对象:"+emp.getName()+"----"+emp.getAge()+"---"+emp.getSalary()); taker.setMemento(emp.memento());//进行备忘 emp.setAge(20); emp.setSalary(3000); System.out.println("第二次打印对象:"+emp.getName()+"----"+emp.getAge()+"---"+emp.getSalary()); emp.recovery(taker.getMemento());//数据恢复 System.out.println("第三次打印对象:"+emp.getName()+"----"+emp.getAge()+"---"+emp.getSalary()); }}
输出结果:
5. 总结
1、当备忘点较多时
- 设置栈将备忘点压栈
- 将多个备忘录对象持久化和序列化保存到本地
2、优点:
- 备忘录模式可以把发起人内部信息对象屏蔽起来,从而可以保持封装的边界。
- 简化了发起人类。当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。
3、缺点:
- 如果状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象比较昂贵。
- 当发起者对象的状态改变的时候,有可能这个协议无效。如果状态改变的成功率达不到要求,可以考虑采取“假如”协议模式。
4、开发中的应用场景
- 数据库事务管理中的回滚操作
- 文本编译器中的Ctrl+z回退操作
转载地址:https://blog.csdn.net/hxcaifly/article/details/88077210 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月21日 00时44分46秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
猿来绘Java-35-线程的同步(生产者和消费者问题)
2019-04-29
猿来绘Java-36-解决线程安全问题
2019-04-29
猿来绘Java-37-ReentrantLock解决线程安全问题
2019-04-29
猿来绘Java-38-生产者消费者模型
2019-04-29
猿来绘Java-39-JDK8的新日期时间类
2019-04-29
猿来绘Java-40-比较器(Comparable 接口与 CompareTo方法)
2019-04-29
猿来绘Java-41-源码分析String对象的数组的排序(JDK1.8)
2019-04-29
猿来绘Java-42-枚举类的使用
2019-04-29
猿来绘Java-43-初步认识注解
2019-04-29
猿来绘Java-44-自定义注解和元注解
2019-04-29
猿来绘Java-45-JDK8新特性可重复注解和类型注解
2019-04-29
猿来绘Java-46-Collection接口及其方法
2019-04-29
猿来绘Java-47- foreatch 增强for循环
2019-04-29
2021/4/27课堂总结和作业
2019-04-29
2021.4.28课堂总结和作业
2019-04-29
2021.4.29课堂总结
2019-04-29
2021.4.30课堂总结和作业
2019-04-29
需要吗?2000GB+学习视频教程 面试资料免费下载
2019-04-29
MySQL对已存在数据库表添加自增ID字段
2019-04-29