【Java中23种面试常考的设计模式之备忘录模式(Memento)---行为型模式】

Java中23种面试常考的设计模式之备忘录模式(Memento)

之前我们讲过的设计模式在这里呦:
【面试最常见的设计模式之单例模式】
【面试最常见的设计模式之工厂模式】
接下来我们要进行学习的是:备忘录模式。

备忘录模式

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

生产生活中常用的使用场景

  1. 各种应用软件中,存档历史记录。
  2. 管理系统中,消息撤回功能。
  3. 棋类游戏中,悔棋。
  4. 普通软件中,撤销操作。
  5. 数据库软件中,事务管理中的,回滚操作。
  6. 等等等等。。。。。。。。

备忘录模式优点与缺点

优点:

1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
2、实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点:

消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

核心内容

备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。

备忘录模式中的类用途
源发起类Originator负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态
备忘录类Memento负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问Memento
负责人类CareTaker负责保存好备忘录Memento

UML类图

在这里插入图片描述

具体代码实现

Games类:对应的就是我们的源发起类Originator
package com.memento;

/*
* Games 游戏类(对应的属性、构造方法、每走一步的保存操作、悔棋的操作、set方法、get方法)
*/
public class Games {

    private String gameName;

    private int curX;

    private int curY;

    public Games(){}

    public Games(String gameName,int curX,int curY){
        this.gameName=gameName;
        this.curX=curX;
        this.curY=curY;
    }

    // 保存记录
    public GamesMemento saveMemento(){
        return new GamesMemento(this);
    }

    // 恢复记录
    public void recovery(GamesMemento gamesMemento){
        this.gameName=gamesMemento.getGameName();
        this.curX=gamesMemento.getCurX();
        this.curY=gamesMemento.getCurY();
    }

    public void setGameName(String gameName){
        this.gameName=gameName;
    }

    public String getGameName(){
        return this.gameName;
    }


    public void setCurX(Integer curX){
        this.curX=curX;
    }

    public Integer getCurX(){
        return this.curX;
    }

    public void setCurY(Integer curY){
        this.curY=curY;
    }

    public Integer getCurY(){
        return this.curY;
    }

    public String toString(){
        return "象棋棋子向X方向移动:"+this.curX+"  象棋棋子向Y方向移动:"+this.curY;
    }
}

GamesMemento类:对应的就是我们的备忘录类Memento
package com.memento;

/*
* GamesMemento 游戏的存储记录类
*/
public class GamesMemento {

    private String gameName;

    private int curX;

    private int curY;


    public GamesMemento(){}

    public GamesMemento(String gameName,Integer curX,Integer curY){
        this.gameName=gameName;
        this.curX=curX;
        this.curY=curY;
    }


    public GamesMemento(Games games){
        this.gameName=games.getGameName();
        this.curX=games.getCurX();
        this.curY=games.getCurY();
    }

    public void setGameName(String gameName){
        this.gameName=gameName;
    }

    public String getGameName(){
        return this.gameName;
    }


    public void setCurX(Integer curX){
        this.curX=curX;
    }

    public Integer getCurX(){
        return this.curX;
    }

    public void setCurY(Integer curY){
        this.curY=curY;
    }

    public Integer getCurY(){
        return this.curY;
    }
}

GamesMementoManagement类:对应的就是我们的负责人类CareTaker
package com.memento;

/*
* GamesMementoManagement 管理我们的存储记录类
* 这个类是支持扩展的,如果想要保存多个状态,那么我们可以通过集合来记录每一个游戏中保存的状态
*/
public class GamesMementoManagement {


    private GamesMemento gamesMemento;


    public void setGamesMemento(GamesMemento gamesMemento){
        this.gamesMemento=gamesMemento;
    }

    
    public GamesMemento getGamesMemento(){
        return this.gamesMemento;
    }

}

测试类:
package com.memento;

public class Main {
    
    public static void main(String[] args){
        // 先创建我们的记录管理类
        GamesMementoManagement gamesMementoManagement=new GamesMementoManagement();
        Games games=new Games("象棋大战",4,6);
        System.out.println(games);
        GamesMemento gamesMemento=games.saveMemento();
        gamesMementoManagement.setGamesMemento(gamesMemento);

        games=new Games("象棋大战",5,9);
        System.out.println(games);
        System.out.println("此时走错了,想悔棋啦。。。。。。");
        games.recovery(gamesMementoManagement.getGamesMemento());
        System.out.println("悔棋成功,回到了最起初保存的状态!!!");
        System.out.println(games);
    }
}

运行结果截图:

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值