大话设计模式-备忘录模式的实践-象棋悔棋

在这里插入图片描述

象棋类

/** * 须要备忘的象棋信息 */
public class Chessman {
    //象棋的基本信息
    private String name;
    private int x;
    private int y;


    /** * 备忘当前象棋的状态 * * @return */
    public ChessmanMemento CreateMemento() {
        return new ChessmanMemento(name, x, y);
    }

    /** * 使用备忘录恢复象棋状态 * * @param chessmanMemento */
    public void setMemento(ChessmanMemento chessmanMemento) {
        this.name = chessmanMemento.getName();
        this.x = chessmanMemento.getX();
        this.y = chessmanMemento.getY();
    }


    public Chessman() {
    }

    public Chessman(String name, int x, int y) {
        this.name = name;
        this.x = x;
        this.y = y;
    }

    public String getName() {
        return name;
    }

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

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    @Override
    public String toString() {
        return "Chessman{" +
                "name='" + name + '\'' +
                ", x=" + x +
                ", y=" + y +
                '}';
    }
}

象棋备忘录类 用于保存象棋的信息 能够悔棋

/** * 备忘录 用于保存象棋的状态信息 */
public class ChessmanMemento {
    //备忘象棋的基本信息
    private String name;
    private int x;
    private int y;

    public ChessmanMemento(String name, int x, int y) {
        this.name = name;
        this.x = x;
        this.y = y;
    }

    public String getName() {
        return name;
    }

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

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

管理备忘录的类

/** * 备忘录负责人 管理备忘录 隐藏备忘录内部实现 */
public class MementoCaretaker {
    private ChessmanMemento chessmanMemento;

    public ChessmanMemento getChessmanMemento() {
        return chessmanMemento;
    }

    public void setChessmanMemento(ChessmanMemento chessmanMemento) {
        this.chessmanMemento = chessmanMemento;
    }
}

测试主类

/** * 象棋悔棋备忘录测试 */
public class Main {
    public static void main(String[] args) {
        //象棋初始状态
        Chessman chessman = new Chessman("马", 1, 1);
        System.out.println(chessman);

        //保存象棋当前的状态到备忘录
        MementoCaretaker mementoCaretaker = new MementoCaretaker();
        mementoCaretaker.setChessmanMemento(chessman.CreateMemento());

        //修改了象棋的状态
        chessman.setX(666);
        chessman.setY(666);
        System.out.println(chessman);


        //此时想要悔棋 能够用备忘录里的数据恢复
        chessman.setMemento(mementoCaretaker.getChessmanMemento());
        System.out.println(chessman);

    }
}