java 设计模式之备忘录模式①⑧
撑不住的时候,可以对自己说声“我好累”,但永远不要在心里承认说“我不行”。不要在最该奋斗的年纪选择了安逸。没什么好说的,一无所有就是奋斗的理由,我们试着长大,一路跌跌撞撞,然后遍体鳞伤,总有一天,你会站在最亮的地方,活成自己曾经渴望的模样。
设计模式学习,近期我会把23种设计模式都写成博客,敬请期待~
—2021/1/25
定义
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
角色分析
UML类图(1.1):
- Originator(发起人) : 负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,
- Memento(备忘录): 用来保存当前状态
- Caretaker(备忘录管理者):负责管理所有存储的状态
使用场景
假设我们现在在进行打BOSS游戏,默认生命值为100
每攻击BOSS一次,生命值就会降低
等BOSS死亡后,恢复到生命值为100这里就使用到了备忘录模式
记录每一次的生命值,可以随意切换状态!
代码实现(经典案例一)
Originator需要保存的状态:
public class Originator {
String info;
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
/**
* 保存状态
* @return 当前状态用一个类来保存
*/
public Memento saveState(){
return new Memento(info);
}
/**
* 恢复状态
* @return 当前状态
*/
public void RecoveryStatus(Memento memento){
info = memento.info;
}
}
方法分析:
- saveState() 用来创建Memento()来保存当前状态
- RecoveryStatus() 因为Memento方法参数和当前类中的参数一样,所以恢复状态的时候通过Memento状态来恢复当前即可
Memento(备忘录)用来保存状态:
public class Memento {
public String info;
public Memento(String info) {
this.info = info;
}
}
Caretaker备忘录管理类:
public class Caretaker {
/**
* 以List的方式保存状态
*/
ArrayList<Memento> list = new ArrayList<>();
//添加状态
public void add(Memento memento){
list.add(memento);
}
//获取状态
public Memento getMemento(int index){
return list.get(index);
}
}
测试代码(客户端):
//备忘录管理器
Caretaker caretaker = new Caretaker();
//需要保存状态
Originator originator = new Originator();
originator.setInfo("100");
//保存状态 并添加到备忘录管理器中
caretaker.add(originator.saveState());
Log.i("备忘录模式", "当前状态 :" + originator.getInfo());
originator.setInfo("80");
//保存状态 并添加到备忘录管理器中
caretaker.add(originator.saveState());
Log.i("备忘录模式", "当前状态 :" + originator.getInfo());
originator.setInfo("30");
//保存状态 并添加到备忘录管理器中
caretaker.add(originator.saveState());
Log.i("备忘录模式", "当前状态 :" + originator.getInfo());
//恢复当前状态
originator.RecoveryStatus(caretaker.getMemento(1));
Log.i("备忘录模式", "当前状态 :+" + originator.getInfo());
在使用时,只需备忘录管理类(Caretaker)和需要保存状态类(Originator)交互即可
Log图(2.1):
优点:
- 会保存所有的状态,可以随意切换状态
缺点:
- 因为保存了所有的状态,所以会创建很多类,不利于维护
- 如果创建状态很多的情况下,很不好管理,会导致分不清状态是内个.
代码实现(经典案例二)
只保存一次状态
GameRole(需要保存状态的类):
public class GameRole {
//攻击力
private int aggressivity;
//防御力
private int defensive_power;
//保存当前状态
public Memento2 saveState(){
return new Memento2(aggressivity,defensive_power);
}
//恢复当前状态
public void recoveryState(Memento2 memento2){
this.aggressivity = memento2.getAggressivity();
this.defensive_power = memento2.getDefensive_power();
}
set... get...
}
Memento2(备忘录):
public class Memento2 {
//攻击力
private int aggressivity;
//防御力
private int defensive_power;
public Memento2(int aggressivity, int defensive_power) {
this.aggressivity = aggressivity;
this.defensive_power = defensive_power;
}
set... get...
}
Caretaker2(备忘录管理类):
public class Caretaker2 {
//保存Memento2状态
private Memento2 memento2;
public Memento2 getMemento2() {
return memento2;
}
public void setMemento2(Memento2 memento2) {
this.memento2 = memento2;
}
}
测试代码(客户端):
GameRole gameRole = new GameRole();
//默认攻击力
gameRole.setAggressivity(100);
//默认防御力
gameRole.setDefensive_power(100);
Log.i("备忘录模式2",
"当前状态 :攻击力: " + gameRole.getAggressivity() +
" 防御力:" + gameRole.getDefensive_power());
//备忘录
Caretaker2 caretaker2 = new Caretaker2();
//保存状态
caretaker2.setMemento2(gameRole.saveState());
//大战后攻击力和防御力降低到50
gameRole.setAggressivity(50);
gameRole.setDefensive_power(50);
Log.i("备忘录模式2",
"当前状态 :攻击力: " + gameRole.getAggressivity() +
" 防御力:" + gameRole.getDefensive_power());
//恢复状态
gameRole.recoveryState(caretaker2.getMemento2());
Log.i("备忘录模式2",
"当前状态 :攻击力: " + gameRole.getAggressivity() +
" 防御力:" + gameRole.getDefensive_power());
备忘录模式还是简单的,希望本篇能够帮助到您~
原创不易,您的点赞就是对我最大的支持~