首页 > 其他分享 >备忘录模式(Memento)

备忘录模式(Memento)

时间:2022-11-27 13:44:46浏览次数:30  
标签:salary name 备份 模式 public 备忘录 id Memento String

支持回滚状态的一种模式。

核心:

  创建一个拷贝对象进行备份。

  给数据对象两个方法:1、进行备份。2、回滚。


需要备份的数据:

public class Datas {
    private int id;
    private String name;
    private double salary;

    //进行备份,获取备份对象
    public DatasMemento memento(){
        return new DatasMemento(this);
    }

    //回滚操作,指定回滚对象
    public void recovery(DatasMemento dm){
        this.id = dm.getId();
        this.name = dm.getName();
        this.salary = dm.getSalary();
    }
    
    public Datas(int id, String name, double salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }

    public int getId() { return id; }

    public void setId(int id) { this.id = id; }

    public String getName() { return name; }

    public void setName(String name) { this.name = name; }

    public double getSalary() { return salary; }

    public void setSalary(double salary) { this.salary = salary; }
    
    @Override
    public String toString() {
        return "Datas{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                '}';
    }
}

备份对象:把对象数据拷贝一次罢了。

public class DatasMemento {
    private int id;
    private String name;
    private double salary;
    //通过构造器直接备份对象
    public DatasMemento(Datas datas) {
        this.id = datas.getId();
        this.name = datas.getName();
        this.salary = datas.getSalary();
    }

    public int getId() { return id; }

    public void setId(int id) { this.id = id; }

    public String getName() { return name; }

    public void setName(String name) { this.name = name; }

    public double getSalary() { return salary; }

    public void setSalary(double salary) { this.salary = salary; }
}

测试:

public class Client {
    public static void main(String[] args) {
        //创建一个对象
        Datas d = new Datas(1,"二哥",998);
        //准备一个容器,存放备份对象
        List<DatasMemento> list = new ArrayList<>();
        //备份一次,并且丢入容器中
        list.add(d.memento());

        //更改数据,并备份一次
        d.setSalary(1111);
        list.add(d.memento());
        System.out.println(d);

        //回滚操作:到最开始的情况
        d.recovery(list.get(0));
        System.out.println(d);

        //回滚操作:到第一次修改后
        d.recovery(list.get(1));
        System.out.println(d);
    }
}

测试结果:

 

标签:salary,name,备份,模式,public,备忘录,id,Memento,String
From: https://www.cnblogs.com/lurenjia-bky/p/16929541.html

相关文章

  • 观察者模式(Observer)
    多个观察者关注同一个目标,当目标发生改变时,观察者们可以收到消息。(立刻更新消息,或者想知道的时候更新消息。)实现:1、自定义观察者:观察者与目标有一致的状态属性,目标......
  • 【ClickHouse为什么这么快?】Hyperscan 超扫描算法:用于现代CPU的“快速-多模式”正则表
    ASIMDinstructionexecutesthesameoperationonmultipledatainparallel.ASIMDOperationASIMDoperationisperformedon multiplelanesoftwoSIMDregiste......
  • 17-设计模式
    typora-root-url:images一、概述​ 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。​ 设计模式免去我们自己再思考......
  • Win7+IIS7下用FastCGI模式配置PHP环境
    今天看中了个PHP的程序想本地调试,因为我用的是WIN7的系统和自带的IIS7,又不想去下载apache服务器,记得以前看过让IIS支持PHP的方法,是使用isapi方式加载的,听说现在php5.3已经......
  • 转载:stm32——GPIO的定义、模式、初始化结构体变量、常用库函数与编程套路
    一、GPIO定义GPIO(GENERALPURPOSEI/OPORTS)意思为通用输入/输出端口,可以为CPU提供数字输入输出功能。通俗地说,就是一些引脚,CPU可以通过它们输出高低电平或者通过它们读入......
  • 字符串模式匹配算法 C++
    #include<iostream>#include<vector>#include<string>usingnamespacestd;//处理模式串,每一个位置都赋值为已匹配的位数vector<int>next_pos(stringpattern){ ......
  • 23种设计模式
    23种设计模式1、了解设计模式设计模式是前辈们对代码开发经验的总结,是解决特定问题的一系列套路,他不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性......
  • 状态模式(State)
    当类的行为是基于它的状态改变时,使用状态模式。比如红绿灯控制路口司机的行为。应用:用来解决系统中复杂对象的状态转换,以及不同状态下的行为封装问题。结构:Sta......
  • 模板方法模式(Template)
    做一件事情,流程是固定的,其中存在不确定的同一类事务。例如:去店里吃饭:1、进入店铺。2、点单。3、吃饭。不确定的是第二步:点单。实现:在父类中定义好统一的......
  • 策略模式(Strategy)
    当处理同一个对象有多个处理算法的时候,使用一个策略对象来选择处理算法。  例子:对于客户的优惠率。算法实现统一的接口:publicinterfaceStrategy{pub......