java23种设计模式十五(连载)

Posted lynnlovemin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java23种设计模式十五(连载)相关的知识,希望对你有一定的参考价值。

备忘录模式

备忘录模式又称备份模式、标记模式。顾名思义,其就是在某一时刻保存当前状态,作为备份,以便下次可以使用,或者恢复到上一次的状态。

备忘录模式分为三个角色:

  • 普通类:用于定义要备份的对象
  • 备份类:用于备份普通对象上一次的操作、状态
  • 备份管理类:用于保存恢复备份

备忘录模式的应用范围很广,我相信大家都下过棋,在下棋时,由于自己的粗心,导致下错了,这时你想悔棋,就会用到备忘录模式。在备忘录模式,我们需要保存上一次下棋的落子点,在当前下棋出现失误的时候,才能恢复到上一次的状态。

下面,我就以围棋为例,来演示备忘录模式。

/**
 * 围棋类
 */
public class Chess {

    /**
     * 落子的横坐标
     */
    private int posX;
    /**
     * 落子纵坐标
     */
    private int posY;

    /**
     * 备份当前落子点
     * @return
     */
    public ChessMemento createChessMemento(){
        return new ChessMemento(posX,posY);
    }

    /**
     * 开始下期
     */
    public void play(int posX,int posY){
        this.posX = posX;
        this.posY = posY;
    }

    /**
     * 恢复备份
     * @param chessMemento
     */
    public void restore(ChessMemento chessMemento){
        this.posX = chessMemento.getPosX();
        this.posY = chessMemento.getPosY();
    }

    public void setPosX(int posX) {
        this.posX = posX;
    }

    public void setPosY(int posY) {
        this.posY = posY;
    }

    public int getPosX() {
        return posX;
    }

    public int getPosY() {
        return posY;
    }
}
/**
 * 备份类
 */
public class ChessMemento {

    /**
     * 落子的横坐标
     */
    private int posX;
    /**
     * 落子的纵坐标
      */
    private int posY;

    public ChessMemento(int posX,int posY){
        this.posX = posX;
        this.posY = posY;
    }

    public int getPosX() {
        return posX;
    }

    public int getPosY() {
        return posY;
    }
}
/**
 * 备份管理类
 */
public class MementoCaretaker {

    /**
     * 备份
     */
    private ChessMemento chessMemento;

    /**
     * 恢复备份
     * @return
     */
    public ChessMemento retore(){
        return this.chessMemento;
    }

    public void save(ChessMemento chessMemento){
        this.chessMemento = chessMemento;
    }
}
/**
 * 客户端
 */
public class Client {

    public static void main(String[] args) {
        Chess chess = new Chess();
        System.out.println("开始下棋。。。");
        chess.setPosX(10);
        chess.setPosY(10);
        System.out.printf("备份当前状态。。。当前落子点为:(%s,%s)\\n",chess.getPosX(),chess.getPosY());
        ChessMemento chessMemento = chess.createChessMemento();
        MementoCaretaker mementoCaretaker = new MementoCaretaker();
        mementoCaretaker.save(chessMemento);
        System.out.println("备份完成。。。");
        chess.play(12,15);
        System.out.println("继续落子。。。");
        System.out.printf("下错位置了,当前落子点为:(%s,%s)\\n",chess.getPosX(),chess.getPosY());
        System.out.println("开始悔棋,恢复到上一次下棋点。。。");
        chess.restore(mementoCaretaker.retore());
        System.out.printf("悔棋完成,当前落子点为:(%s,%s)\\n",chess.getPosX(),chess.getPosX());
    }
}

运行效果如下:
在这里插入图片描述

应用场景

关于备忘录模式的应用场景,在本文开头,我已经做了简单的介绍,又比如目前智能手机都有备忘录的功能,这也是其应用场景之一。
在jdk中也有备忘录的身影,比如Date类中,通过fastTime来保存历史历史时间。

public class Date
   implements java.io.Serializable, Cloneable, Comparable<Date>
{
   private static final BaseCalendar gcal =
                               CalendarSystem.getGregorianCalendar();
   private static BaseCalendar jcal;

   private transient long fastTime;
}

以上是关于java23种设计模式十五(连载)的主要内容,如果未能解决你的问题,请参考以下文章

java23种设计模式十五(连载)

java23种设计模式十五(连载)

EasyClick 原生UI连载三十五

23种设计模式(十五)——适配器模式接口隔离

「Vue.js开发连载十五」生命周期

《灵州史研究》白述礼著连载十五