备忘录模式示例代码提交

This commit is contained in:
xuwujing
2018-11-16 16:50:42 +08:00
parent 3047ce7964
commit f0a0466472
2 changed files with 274 additions and 0 deletions

View File

@@ -0,0 +1,266 @@
package com.pancm.design.memento;
import java.util.ArrayList;
import java.util.List;
/**
* @Title: MementoTest
* @Description:
备忘录模式 备忘录模式Memento Pattern保存一个对象的某个状态以便在适当的时候恢复对象。备忘录模式属于行为型模式。
核心: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
* @Version:1.0.0
* @author pancm
* @date 2018年10月29日
*/
public class MementoTest {
/**
* @param args
*/
public static void main(String[] args) {
/*
* 基本使用
基本角色:备忘录(Memento)角色、发起人(Originator)角色、负责人(Caretaker)角色。
1.备忘录(Memento):主要的功能是包含要被恢复的对象的状态。
2.发起人(Originator):在创建的时候,会在备忘录对象中存储状态。
3.负责人(Caretaker):主要是负责从 备忘录对象中恢复对象的状态。
*/
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
originator.setState("State #1");
originator.setState("State #2");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #3");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + originator.getState());
/*
* 使用
* 常见场景就是游戏存档,电脑中的 Ctrl+Z撤销功能
*/
int level = 1;
int life = 100;
//创建一个玩家
Player player =new Player(level, life);
System.out.println("玩家xuwujing进入游戏!");
//状态
player.getStatus();
//进行练级
player.leveling();
GameSavePage savePage =new GameSavePage();
//状态
player.getStatus();
System.out.println("玩家xuwujing正在存档...");
//第一次存档
savePage.setSm(player.saveStateToMemento());
System.out.println("玩家xuwujing存档成功!");
System.out.println("玩家xuwujing挑战新手村的BOSS!");
boolean flag=player.challengeBOSS();
if(flag) {
System.out.println("玩家xuwujing挑战BOSS成功!");
return;
}
System.out.println("玩家xuwujing挑战BOSS失败!游戏结束!开始读取存档...");
savePage.getSm();
System.out.println("玩家xuwujing读取存档成功!");
//进行练级
player.leveling();
//状态
player.getStatus();
System.out.println("玩家xuwujing挑战新手村的BOSS!");
flag=player.challengeBOSS();
if(flag) {
System.out.println("玩家xuwujing挑战BOSS成功!");
return;
}
/*
玩家xuwujing进入游戏!
玩家xuwujing当前信息:
人物等级:1,人物生命:100
恭喜玩家xuwujing升级!等级提升了1,生命提升了10
玩家xuwujing当前信息:
人物等级:2,人物生命:110
玩家xuwujing正在存档...
玩家xuwujing存档成功!
玩家xuwujing挑战新手村的BOSS!
玩家xuwujing挑战BOSS失败!游戏结束!开始读取存档...
玩家xuwujing读取存档成功!
恭喜玩家xuwujing升级!等级提升了1,生命提升了10
玩家xuwujing当前信息:
人物等级:3,人物生命:120
玩家xuwujing挑战新手村的BOSS!
玩家xuwujing挑战BOSS成功!
*/
/*
* 优点:
1、给用户提供了一种可以恢复状态的机制可以使用户能够比较方便地回到某个历史的状态。
2、实现了信息的封装使得用户不需要关心状态的保存细节。
缺点:
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
使用场景:
1、需要保存/恢复数据的相关状态场景。
2、提供一个可回滚的操作。
注意事项:为了节约内存,可使用原型模式+备忘录模式。
*/
}
}
/*
* 创建一个备忘录
*/
class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
/*
* 设置一个起因
*/
class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento Memento) {
state = Memento.getState();
}
}
/*
* 设置一个看门者
*/
class CareTaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state) {
mementoList.add(state);
}
public Memento get(int index) {
return mementoList.get(index);
}
}
//创建一个存档 信息(备忘录)
class SaveMsg{
//存档等级
private int level;
//存档时的生命值
private int life;
public SaveMsg( int level, int life) {
super();
this.level = level;
this.life = life;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public int getLife() {
return life;
}
public void setLife(int life) {
this.life = life;
}
}
//设置一个玩家(发起者)
class Player {
//等级
private int level;
//生命值
private int life;
public Player( int level, int life) {
super();
this.level = level;
this.life = life;
}
//保存信息
public SaveMsg saveStateToMemento() {
return new SaveMsg(level,life);
}
//恢复信息
public void getStateFromMemento(SaveMsg sm) {
this.level = sm.getLevel();
this.life = sm.getLife();
}
//获取当前状态
public void getStatus() {
System.out.println("玩家xuwujing当前信息:");
System.out.println("人物等级:"+level+",人物生命:"+life);
}
//练级
public void leveling() {
this.level = this.level+1;
this.life = this.life+10;
System.out.println("恭喜玩家xuwujing升级!等级提升了1,生命提升了10");
}
//挑战BOSS
public boolean challengeBOSS() {
//设置条件
return this.level>2&&this.life>100;
}
}
//设置一个游戏存档页(负责人)
class GameSavePage{
private SaveMsg sm;
public SaveMsg getSm() {
return sm;
}
public void setSm(SaveMsg sm) {
this.sm = sm;
}
}

View File

@@ -0,0 +1,8 @@
/**
* @Title: package-info
* @Description: 备忘录模式
* @Version:1.0.0
* @author pancm
* @date 2018年8月8日
*/
package com.pancm.design.memento;