【Java设计模式】行为型模式-备忘录模式
2018-10-28 本文已影响0人
灰色孤星
源代码:https://gitee.com/AgentXiao/BehavioralPatterns
要点:
1、备忘录模式的实现
2、数据库的回滚操作
一、场景
Word文档编辑时,忽然电脑死机或断电,再打开时,可以看到word 提示你恢复到以前的文档。
二、备忘录模式
1、核心
就是保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态。
2、结构
- 源发器类Originator
- 备忘录类Memento
- 负责人类CareTaker
3、实现
/**
* @ClassName Originator
* @Description 源发器类
* @Author xwd
* @Date 2018/10/28 19:37
*/
public class Originator {
private String name;
private int age;
private double salary;
/**
* @MethodName memento
* @Descrition 备忘一次
* @Param []
* @return pri.xiaowd.memento.Memento
*/
public Memento memento(){
return new Memento(this);
}
/**
* @MethodName recovery
* @Descrition 恢复数据
* @Param [memento]
* @return void
*/
public void recovery(Memento memento){
this.name = memento.getName();
this.age = memento.getAge();
this.salary = memento.getSalary();
}
public Originator() {
}
public Originator(String name, int age, double 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 double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Originator{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
}
/**
* @ClassName Memento
* @Description 备忘录类
* @Author xwd
* @Date 2018/10/28 19:38
*/
public class Memento {
private String name;
private int age;
private double salary;
/**
* @MethodName Memento
* @Descrition 创建时将源发器类的信息传入
* @Param [originator]
* @return
*/
public Memento(Originator originator) {
this.name = originator.getName();
this.age = originator.getAge();
this.salary = originator.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 double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
import java.util.HashMap;
import java.util.Map;
/**
* @ClassName CareTaker
* @Description 负责人类
* @Author xwd
* @Date 2018/10/28 19:38
*/
public class CareTaker {
private Map<String,Memento> map = new HashMap<>();//存储备忘录对象
/**
* @MethodName setMemento
* @Descrition 保存备忘
* @Param [msg, memento]
* @return void
*/
public void setMemento(String msg,Memento memento){
map.put(msg,memento);
}
/**
* @MethodName getMemento
* @Descrition 获得备忘
* @Param [msg]
* @return pri.xiaowd.memento.Memento
*/
public Memento getMemento(String msg){
return map.get(msg);
}
}
/**
* @ClassName Client
* @Description 客户
* @Author xwd
* @Date 2018/10/28 19:49
*/
public class Client {
public static void main(String[] args) {
CareTaker ct = new CareTaker();
Originator originator = new Originator("xwd",18,500);
System.out.println("原始数据:"+originator.toString());
originator.setName("lsm");
originator.setAge(12);
originator.setSalary(6000);
System.out.println("第一次修改后的数据:"+originator.toString());
ct.setMemento("第一次修改",originator.memento());//进行备忘
originator.setName("qqq");
originator.setAge(54);
originator.setSalary(7000);
System.out.println("第二次修改后的数据:"+originator.toString());
originator.recovery(ct.getMemento("第一次修改"));
System.out.println("恢复后的数据:"+originator.toString());
}
测试结果
备忘点较多时
三、总结
开发中常见的应用场景:
棋类游戏中的,悔棋
普通软件中的,撤销操作
数据库软件中的,事务管理中的,回滚操作
Photoshop软件中的,历史记录