尚硅谷设计模式学习(20)---[备忘录模式(Memento Pattern)]
Posted 小智RE0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尚硅谷设计模式学习(20)---[备忘录模式(Memento Pattern)]相关的知识,希望对你有一定的参考价值。
尚硅谷传送门==>B站尚硅谷Java设计模式
❤❤❤感谢尚硅谷❤❤❤
最近开始计划学习一下设计模式了,加油!!!
ml
案例引入:
例如游戏中的玩家状态恢复:
游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当打斗Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态.
按照传统思路解决的话,创建一个对象,就得对应地创建它相应状态的对象,要是备份的数据量对象较多,过于复杂.
备忘录模式
不破坏封装性,捕获一个对象的内部状态,并在该对象之外保存这个状态.
通俗易懂地说就是个记事本,把之前数据先存入,用的时候可以看到之前的信息.
基本原理
Caretaker 管理者: 存储备忘录对象 时,可以存单个,要是多的话就可以存集合
实现了信息的封装,使得用户不需要关心状态的保存细节
备忘录类;Memento
/**
* @author by CSDN@小智RE0
* @date 2021-10-05 11:12
*/
//备忘录对象所在类;
public class Memento {
//备忘录-->状态对象;
private String mementoState;
//初始化时,将原始状态信息存入;
public Memento(String myState) {
this.mementoState = myState;
}
//获取状态信息;
public String getMementoState() {
return mementoState;
}
}
原始类Originator
/**
* @author by CSDN@小智RE0
* @date 2021-10-05 11:12
*/
//原始对象的所在类;
public class Originator {
//原始-->状态信息;
private String myState;
public String getMyState() {
return myState;
}
public void setMyState(String myState) {
this.myState = myState;
}
//保存状态到备忘录;
public Memento holdState(){
return new Memento(myState);
}
//由备忘录恢复;
public void getMyStateFromMemento(Memento memento){
myState = memento.getMementoState();
}
}
存放备忘录的类;Caretaker
/**
* @author by CSDN@小智RE0
* @date 2021-10-05 11:14
*/
//存储聚合备忘录对象;
public class Caretaker {
private List<Memento> mementoList = new ArrayList<Memento>();
//添加备忘录对象;进行存储;
public void addMementos(Memento memento){
mementoList.add(memento);
}
//获取到指定位置的备忘录对象;
public Memento get(int i){
return mementoList.get(i);
}
}
模拟客户端
//模拟客户端
public class Client {
public static void main(String[] args) {
//创建原始类;
Originator originator = new Originator();
//存放备忘录对象的类;
Caretaker caretaker = new Caretaker();
originator.setMyState("初始生命状态 -->1000");
caretaker.addMementos(originator.holdState());
originator.setMyState("经过5分钟状态 -->800");
caretaker.addMementos(originator.holdState());
originator.setMyState("最终状态 -->200");
caretaker.addMementos(originator.holdState());
System.out.println("现在的状态为->"+originator.getMyState());
System.out.println("--恢复初始状态--");
originator.getMyStateFromMemento(caretaker.get(0));
System.out.println(originator.getMyState());
}
}
输出
现在的状态为->最终状态 -->200
--恢复初始状态--
初始生命状态 -->1000
接着回到开始的案例;关于游戏角色的状态问题;
先画图
备忘录类MementoGame
/**
* @author by CSDN@小智RE0
* @date 2021-10-05 12:32
*/
//备忘录类;存储备份的状态;
public class MementoGame {
//攻击力;
private int attackForce;
//防御力;
private int phylacticPower;
//初始化就存入了原始的状态进行备份;
public MementoGame(int attackForce, int phylacticPower) {
this.attackForce = attackForce;
this.phylacticPower = phylacticPower;
}
public int getAttackForce() {
return attackForce;
}
public void setAttackForce(int attackForce) {
this.attackForce = attackForce;
}
public int getPhylacticPower() {
return phylacticPower;
}
public void setPhylacticPower(int phylacticPower) {
this.phylacticPower = phylacticPower;
}
}
角色初始状态类;OriginatorGame
/**
* @author by CSDN@小智RE0
* @date 2021-10-05 12:36
*/
//原始类;存储的是原始状态;
public class OriginatorGame {
//攻击力;
private int attackForce;
//防御力;
private int phylacticPower;
//初始化;
public OriginatorGame(int attackForce, int phylacticPower) {
this.attackForce = attackForce;
this.phylacticPower = phylacticPower;
}
//创建备份,存入原始状态;
public MementoGame createMemento(){
return new MementoGame(attackForce,phylacticPower);
}
//获取备份的数据; 攻击力,防御力;
public void getStateFromMementoGame(MementoGame mementoGame){
this.attackForce= mementoGame.getAttackForce();
this.phylacticPower = mementoGame.getPhylacticPower();
}
//显示当前的角色的状态(攻击力,防御力);
public void show(){
System.out.println("当前攻击力=>"+this.attackForce+" &当前防御力=>"+this.phylacticPower);
}
public int getAttackForce() {
return attackForce;
}
public void setAttackForce(int attackForce) {
this.attackForce = attackForce;
}
public int getPhylacticPower() {
return phylacticPower;
}
public void setPhylacticPower(int phylacticPower) {
this.phylacticPower = phylacticPower;
}
}
存储备忘录对象
/**
* @author by CSDN@小智RE0
* @date 2021-10-05 12:36
*/
//管理者,保存备忘录对象;
public class Caretaker {
//存入备忘录对象;
private MementoGame mementoGame;
public MementoGame getMementoGame() {
return mementoGame;
}
public void setMementoGame(MementoGame mementoGame) {
this.mementoGame = mementoGame;
}
}
模拟客户端
/**
* @author by CSDN@小智RE0
* @date 2021-10-05 12:37
*/
//模拟客户端;
public class Client {
public static void main(String[] args) {
//创建原始游戏角色对象; 设置攻击力,防御力;
OriginatorGame originatorGame = new OriginatorGame(1000,1000);
System.out.println("--------初始的状态为----------");
originatorGame.show();
//备忘录 初始状态存入;
Caretaker caretaker = new Caretaker();
caretaker.setMementoGame(originatorGame.createMemento());
System.out.println("10分钟后,防御力下降---------");
originatorGame.setPhylacticPower(600);
System.out.println("-------状态");
originatorGame.show();
System.out.println("20分钟后,战斗力提升---------");
originatorGame.setAttackForce(2000);
System.out.println("--------状态");
originatorGame.show();
System.out.println("结束,恢复至初始状态----------");
originatorGame.getStateFromMementoGame(caretaker.getMementoGame());
System.out.println("-----恢复后的状态");
originatorGame.show();
}
}
执行
--------初始的状态为----------
当前攻击力=>1000 &当前防御力=>1000
10分钟后,防御力下降---------
-------状态
当前攻击力=>1000 &当前防御力=>600
20分钟后,战斗力提升---------
--------状态
当前攻击力=>2000 &当前防御力=>600
结束,恢复至初始状态----------
-----恢复后的状态
当前攻击力=>1000 &当前防御力=>1000
以上是关于尚硅谷设计模式学习(20)---[备忘录模式(Memento Pattern)]的主要内容,如果未能解决你的问题,请参考以下文章
尚硅谷设计模式学习(23)---[策略模式(strategy pattern)]