某系统提供了用户信息操作模块,用户可以修改自己的各项信息。为了使操作过程更加人性化,现使用备忘录模式对系统进行改进,使得用户在进行了错误操作之后可以恢复到操作之前的状态。用户信息中包含账号、密码、电话

简介: 该博客文章通过Java代码示例介绍了备忘录模式(Memento Pattern)的应用,通过创建备忘录对象保存用户信息的状态,允许用户在进行错误操作后能够恢复到之前的状态。

某系统提供了用户信息操作模块,用户可以修改自己的各项信息。为了使操作过程更加人性化,现使用备忘录模式对系统进行改进,使得用户在进行了错误操作之后可以恢复到操作之前的状态。用户信息中包含账号、密码、电话

绘制UML类图
在这里插入图片描述
信息的初始化建立备忘录
备忘录的创建过程,就是通过构造函数的形式将一个类中的属性赋值给另外一个类里边的属性。实现原始数据的保存。在恢复原始数据时,通过创建另外一个类的对象,通过对象调用属性。然后赋值给这边类里的属性。

package com.zheng;

public class Originator { // 原始数据
    private String name; // 姓名
    private String pwd; // 密码
    private double num; // 电话

    //初始化客户信息
    public Originator(String name,String pwd,double num) {
        this.name=name;
        this.pwd=pwd;
        this.num=num;
    }

    //创建一个备忘录对象
    public Memento save() {
        return new Memento(this.name,this.pwd,this.num);//将原始数据的值保存在备忘录里边
    }

    //恢复状态
    public void restore(Memento memento) {
        this.name=memento.getName();//从备忘录里边取值给原始数据
        this.pwd=memento.getPwd();
        this.num=memento.getNum();
    }

    public String getName() {
        return name;
    }

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

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public double getNum() {
        return num;
    }

    public void setNum(double num) {
        this.num = num;
    }

}

保存客户信息

package com.zheng;

public class Memento {
    private String name; // 姓名
    private String pwd; // 密码
    private double num; // 电话

    //初始化客户信息
    public Memento(String name,String pwd,double num) {
        this.name=name;
        this.pwd=pwd;
        this.num=num;
    }

    public String getName() {
        return name;
    }

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

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public double getNum() {
        return num;
    }

    public void setNum(double num) {
        this.num = num;
    }

}

调用备忘录里边的属性返回给保存的数据

package com.zheng;

public class MementoCaretaker {
    private Memento me;//备忘录对象

    public Memento getMemento() {
        return me;
    }
    public void setMemento(Memento me) {
        this.me=me;
    }

}

测试端

package com.zheng;

public class Client {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        MementoCaretaker mc=new MementoCaretaker();//管理者对象
        Originator cus1=new Originator("小明","12345",12345);//初始化客户1
        System.out.println("状态一:");
        display(cus1);
        mc.setMemento(cus1.save());//保存状态
        System.out.println("----------------------------------");
        System.out.println("状态二:");
        cus1.setPwd("22222");
        cus1.setNum(99999);
        display(cus1);
        System.out.println("----------------------------------");
        System.out.println("状态二回到状态一:");
        cus1.restore(mc.getMemento());//恢复状态
        display(cus1);

    }
    public static void display(Originator o) {
        System.out.println("账户:"+o.getName()+"\n密码:"+o.getPwd()+"\n电话:"+o.getNum());    
    }
}

运行截图
在这里插入图片描述

相关文章
|
2月前
|
监控 安全 Java
别让技术债务拖垮你的系统!从识别、管控到清偿的完整落地手册
本文系统解析技术债务的本质、分类与管控:澄清其非“烂代码”,而是主动权衡;按Martin Fowler四象限与5大类型(代码/架构/测试/依赖/文档)精准识别;结合自动化扫描(SonarQube等)、ArchUnit架构校验与人工评审实现量化管理;提出童子军规则、测试先行重构、绞杀者模式等分层清偿策略,并强调融入全流程的长效机制。
248 3
|
存储 SQL 分布式计算
一文彻底搞懂Hive的数据存储与压缩
怎样弄清Hive的数据存储与压缩呢,以下回答告诉你。
1215 0
一文彻底搞懂Hive的数据存储与压缩
|
存储 弹性计算 Linux
阿里云服务器购买流程参考:快速、自定义、活动三种购买方式详解与流程指南
对于初次接触阿里云服务器的用户来说,选择合适的购买方式并了解详细的购买流程至关重要,阿里云提供了快速购买、自定义购买和活动购买等多种购买方式,以满足不同用户的需求。本文将为大家展示阿里云服务器的三种主要购买方式:快速购买、自定义购买以及通过活动购买,以供大家了解具体的流程,帮助用户轻松上手,快速搭建高效、稳定的云端环境。
559 10
|
12月前
|
数据采集 前端开发 JavaScript
深挖navigator.webdriver浏览器自动化检测的底层分析
本文详细讲解了如何通过技术手段破解浏览器 `navigator.webdriver` 检测,结合爬虫代理、多线程等策略,在豆瓣图书页面批量采集数据。具体包括:隐藏 Selenium 特征、配置代理突破 IP 限制、设置伪装用户、利用多线程提升效率。文章面向初学者,提供分步教程与示例代码,同时设有「陷阱警告」帮助规避常见问题。目标是从底层实现反检测,高效采集图书评分、简介、作者等信息,适合具备 Python 和 Selenium 基础的读者实践学习。
481 12
深挖navigator.webdriver浏览器自动化检测的底层分析
|
小程序
6款无版权可商用的图片网站
6款无版权可商用的图片网站
1504 0
6款无版权可商用的图片网站
|
人工智能 图形学 iOS开发
Luma AI如何注册:文生视频领域的新星
Luma AI如何注册:文生视频领域的新星
536 0
|
消息中间件 缓存 算法
开源7天Github斩获4.5万Stars!阿里2023版高并发设计实录鲨疯了
如何获得高并发经验? 这是我今天逛知乎的时候系统邀请我回答的一个问题,由此也引发了我的一些思考:为什么人人都想要获得高并发经验;想拥有高并发系统设计技能?
|
XML Java API
彻底了解|利用Apache CXF框架开发WebService
前言WebService是为了支持网络的机器间操作交互而设计用来开发分布式的交互操作的应用程序组件,通常被定义为一组模块化的API,他们可以通过网络进行调用,来执行远程系统的请求服务,而...
847 0
|
索引
UVC 基础学习(4):VideoContrl Interface 及其描述符介绍
所有信息整理来源于UVC 官方spec 翻译理解及内核源码做参考
1643 0
|
XML JavaScript 前端开发
Vue3+Element Plus使用svg加载iconfont的解决方案
Element UI作为一款优秀的开源组件库,想必很多人都使用过,在Vue3中,我们需要使用Element Plus。Element Plus有很多好用的组件,详细用法可直接去查看官方文档:[Element Plus](https://element-plus.org/zh-CN/)。本文主要介绍如何在Vue3+Element Plus的项目中,使用自己封装的svg图标。
4657 0
Vue3+Element Plus使用svg加载iconfont的解决方案