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种设计模式十五(连载)的主要内容,如果未能解决你的问题,请参考以下文章