欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > 设计模式之备忘录模式

设计模式之备忘录模式

2024/11/30 12:29:41 来源:https://blog.csdn.net/2301_76862031/article/details/141678153  浏览:    关键词:设计模式之备忘录模式

备忘录模式的概念

备忘录模式是一种行为设计模式,它允许在不暴露对象内部状态的情况下捕获和恢复对象之前的状态。

主要组成部分
 1)Originator(原发器)
        负责创建一个包含其内部状态的备忘录对象。
        可以使用备忘录来恢复其先前的状态。
 2)Memento(备忘录)
        存储原发器的内部状态,并防止外部对象访问这些状态。
        可能会有两种类型的备忘录:一种是简单的,只存储状态;另一种是复杂的,可能包含多个状态快照。
 3)Caretaker(管理者)
        负责保存和获取备忘录对象,但不应该操作备忘录的内容。

举个栗子

平常我们玩单机游戏的时候,通过一关游戏都有备份存档的功能,当游戏角色死亡时,可以选择之前备份的存档继续开始游戏

如下图:

流程如下

开始游戏===>通关第一关===>备份第一关存档===>通关第二关===>备份游戏第二关存档===>挑战第三关失败,游戏角色死亡===>选择存档==>恢复备份存档2==>继续挑战第三关

使用java代码实现

创建用户状态源发器

package org.xiji.menmentopattern;/*** 用户状态源发器*/
public class UserInfoOriginator  {private String userState;/**** 获取用户状态*/public String getUserState() {return userState;}/*** 设置用户状态*/public void setUserState(String userState) {this.userState = userState;}/*** 保存用户当前状态===>保存为备忘录对象*/public UserInfoMemento saveStateToMemento(){return new UserInfoMemento(this.userState);}/*** 通过备忘录对象恢复用户的某一时刻*/public void recoveryUserInfoState(UserInfoMemento userInfoMemento){this.userState = userInfoMemento.getState();}}

创建用户备份管理类

package org.xiji.menmentopattern;import java.util.ArrayList;
import java.util.List;/*** 用户备份类管理类*/
public class UserInfoCaretaker {/*** 备份集合*/private List<UserInfoMemento> mementoList=new ArrayList<>();/*** 添加备份对象*/public void add(UserInfoMemento memento) {mementoList.add(memento);}/*** 获取备份对象*/public UserInfoMemento get(int index) {return mementoList.get(index);}
}

创建用户备状态备份类

package org.xiji.menmentopattern;/*** 用户状态备忘录类*/
public class UserInfoMemento {/*** 状态*/private String state;public UserInfoMemento(String state) {this.state = state;}public String getState() {return state;}/*** 设置状态*  这里用来保存用户状态*/public void setState(String state) {this.state = state;}}

创建BackUpMain启动类

package org.xiji.menmentopattern;/*** 备忘录模式*/
public class BackupMain {public static void main(String[] args) {//创建游戏角色UserInfoOriginator gameUser = new UserInfoOriginator();//角色存档管理器UserInfoCaretaker gameUserSaveManger = new UserInfoCaretaker();//通过第一关System.out.println("通过第一关");gameUser.setUserState("第一关通关");//备份UserInfoMemento firstMemento = gameUser.saveStateToMemento();System.out.println("备份成功");//存放在备忘录管理者中gameUserSaveManger.add(firstMemento);//通过第二关System.out.println("通过第二关");gameUser.setUserState("第二关通关");//备份UserInfoMemento twoMemento = gameUser.saveStateToMemento();System.out.println("备份成功");//存放在备忘录管理者中gameUserSaveManger.add(twoMemento);//用户没有通关,角色死亡System.out.println("游戏没有通关,角色死亡");gameUser.setUserState("游戏结束");System.out.println(gameUser.getUserState());System.out.println("选择存档,并且恢复存档");//选择存档,并且恢复存档gameUser.recoveryUserInfoState(gameUserSaveManger.get(0));System.out.println("游戏恢复到第一关");System.out.println(gameUser.getUserState());//恢复第二关System.out.println("选择存档,并且恢复存档");gameUser.recoveryUserInfoState(gameUserSaveManger.get(1));System.out.println("游戏恢复到第二关");System.out.println(gameUser.getUserState());}
}

运行结果如下

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com