美文网首页
【Java设计模式】行为型模式-备忘录模式

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

作者: 灰色孤星 | 来源:发表于2018-10-28 20:01 被阅读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软件中的,历史记录

    相关文章

      网友评论

          本文标题:【Java设计模式】行为型模式-备忘录模式

          本文链接:https://www.haomeiwen.com/subject/olsmtqtx.html