【Java设计模式】行为型模式-备忘录模式

2018-10-28  本文已影响0人  灰色孤星

源代码:https://gitee.com/AgentXiao/BehavioralPatterns
要点:
1、备忘录模式的实现
2、数据库的回滚操作

一、场景

Word文档编辑时,忽然电脑死机或断电,再打开时,可以看到word 提示你恢复到以前的文档。

二、备忘录模式

1、核心

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

2、结构

备忘录模式的结构

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软件中的,历史记录

上一篇下一篇

猜你喜欢

热点阅读