您现在的位置是:首页 >技术杂谈 >设计模式-备忘录模式网站首页技术杂谈

设计模式-备忘录模式

Evanpatchouli℃ 2024-10-24 00:01:03
简介设计模式-备忘录模式

备忘录模式

备忘录模式提供了一种状态恢复的机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂存的备忘录将状态恢复。

在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

角色

  • 原发器(Originator)

普通类,可以创建一个备忘录,并存储其当前内部状态,也可以使用备忘录来恢复其内部状态,一般需要保存内部状态的类设计为原发器。

  • 备忘录(Memento)

存储原发器的状态,根据原发器来决定保存哪些内部状态。

  • 管理者(CareTaker)

负责保存备忘录,但是不能对备忘录的内容进行操作或检查。

案例

悔棋

Chess: 原发器

/**
 * 原发器
 */
public class Chess
{
    public String lable;
    public int x;
    public int y;

    public Chess(String label, int x, int y) {
        this.lable = label;
        this.x = x;
        this.y = y;
    }

    public void setLabel(String label) {
        this.lable = label;
    }

    public void setXY(int x, int y) {
        this.x = x;
        this.y = y;
    }

    // 保存状态
    public Chess save(){
        return this;
    }

    // 恢复状态
    public void recover(ChessMemento memento){
        System.out.println("悔棋");
        lable = memento.lable;
        x = memento.x;
        y = memento.y;
    }

    @Override
    public String toString() {
        return "Chess{" +
            "lable='" + lable + ''' +
            ", x=" + x +
            ", y=" + y +
            '}';
    }
}

ChessMemento: 棋子备忘录

public class ChessMemento {
    public String lable;
    public int x;
    public int y;

    public ChessMemento() {}

    public void save(Chess chess) {
        this.lable = chess.lable;
        this.x = chess.x;
        this.y = chess.y;
    }
}

MementoCareaTaker: 管理者

public class MementoCareaTaker {
    private ChessMemento chessMemento;

    public MementoCareaTaker() {
        chessMemento = new ChessMemento();
    }

    public ChessMemento getChessMemento() {
        return chessMemento;
    }
}

Main:

public class Main {
    public static void main(String[] args) {
        MementoCareaTaker mementoCareaTaker = new MementoCareaTaker();
        Chess chess = new Chess("车", 1, 1);
        mementoCareaTaker.getChessMemento().save(chess);
        display(chess);
        chess.setXY(2,2);
        display(chess);
        chess.recover(mementoCareaTaker.getChessMemento());
        display(chess);
    }

    public static void display(Chess chess){
        System.out.println(chess);
    }
}

Output:

Chess{lable='车', x=1, y=1}
Chess{lable='车', x=2, y=2}
悔棋
Chess{lable='车', x=1, y=1}

备忘录模式的优缺点

优点:

  1. 提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤。
  2. 实现了对信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动。

缺点:

  1. 保存状态的资源消耗大

应用场景

  • 需要保存一个对象在某一个时刻的全部状态或部分状态状态,以便需要在后面需要时可以恢复到先前的状态。
  • 防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。