设计模式读书笔记之备忘录模式(Memento)
2016-04-25 09:13
453 查看
备忘录模式:在不破坏封装性的前提下,捕获对象的内部状态并保存,这样以后就可以恢复该对象恢复到保存的状态。
备忘录模式比较简单, 不要因为名字比较陌生而不敢学它. 它没有复杂的结构, 上图已经能足够说明问题.
Originator: 备忘录发起人, 通常是需要备忘的对象自己.
Memento: 备忘录对象, 保存了Originator的内部状态.
CareTaker: 备忘录管理者.
基本代码:
[java] view
plain copy
//备忘录发起人,即需要备忘的对象
package designpattern.memento;
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Memento createMemo(){
return new Memento(state);
}
public void recover(Memento m){
this.state = m.getState();
}
public void show(){
System.out.println("state = " + state);
}
}
//备忘录
package designpattern.memento;
public class Memento {
private String state;
public String getState() {
return state;
}
public Memento(String state){
this.state = state;
}
}
//备忘录管理者
package designpattern.memento;
public class CareTaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
//test case
package designpattern.memento;
public class Test {
public static void main(String[] args) {
Originator o = new Originator();
o.setState("On");
o.show();
CareTaker c = new CareTaker();
c.setMemento(o.createMemo());
o.setState("Off");
o.show();
o.recover(c.getMemento());
o.show();
}
}
举例:
打rpg游戏的时候经常在打大boss之前把游戏保存一下,如果死了,就重新来。其实这就是备忘录模式。看代码:
[java] view
plain copy
package designpattern.memento.game;
public class GameRole {
private int vitality;
private int attack;
private int defense;
public GameRole(){
this.vitality = 100;
this.attack = 100;
this.defense = 100;
}
public void showState(){
System.out.println("vitality = " + vitality + "/nattack = " + attack + "/ndefence = " + defense);
}
public RoleStateMemo save(){
return new RoleStateMemo(vitality, attack, defense);
}
public void recover(RoleStateMemo m){
System.out.println("太菜了我,还好我存盘了,哈哈。");
System.out.println("复活中......");
this.vitality = m.getVitality();
this.attack = m.getAttack();
this.defense = m.getDefense();
System.out.println("又复活了.");
}
public void fight(){
System.out.println("与大Boss决战./n......");
System.out.println("你输了, 你的生命,防御, 战斗力都将减为0.");
this.vitality = 0;
this.defense = 0;
this.attack = 0;
}
}
//
package designpattern.memento.game;
public class RoleStateMemo {
private int vitality;
private int attack;
private int defense;
public RoleStateMemo(int v, int a, int d){
this.vitality = v;
this.attack = a;
this.defense = d;
}
public int getVitality() {
return vitality;
}
public void setVitality(int vitality) {
this.vitality = vitality;
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
this.attack = attack;
}
public int getDefense() {
return defense;
}
public void setDefense(int defense) {
this.defense = defense;
}
}
//
package designpattern.memento.game;
public class RoleMemoManager {
private RoleStateMemo m;
public RoleStateMemo getM() {
return m;
}
public void setM(RoleStateMemo m) {
this.m = m;
}
}
//test case
package designpattern.memento.game;
public class Test {
public static void main(String[] args) {
GameRole role = new GameRole();
role.showState();
RoleMemoManager manager = new RoleMemoManager();
manager.setM(role.save());
role.fight();
role.showState();
role.recover(manager.getM());
role.showState();
}
}
适用情景:
需要维护或记录历史的类。
备忘录模式比较简单, 不要因为名字比较陌生而不敢学它. 它没有复杂的结构, 上图已经能足够说明问题.
Originator: 备忘录发起人, 通常是需要备忘的对象自己.
Memento: 备忘录对象, 保存了Originator的内部状态.
CareTaker: 备忘录管理者.
基本代码:
[java] view
plain copy
//备忘录发起人,即需要备忘的对象
package designpattern.memento;
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Memento createMemo(){
return new Memento(state);
}
public void recover(Memento m){
this.state = m.getState();
}
public void show(){
System.out.println("state = " + state);
}
}
//备忘录
package designpattern.memento;
public class Memento {
private String state;
public String getState() {
return state;
}
public Memento(String state){
this.state = state;
}
}
//备忘录管理者
package designpattern.memento;
public class CareTaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
//test case
package designpattern.memento;
public class Test {
public static void main(String[] args) {
Originator o = new Originator();
o.setState("On");
o.show();
CareTaker c = new CareTaker();
c.setMemento(o.createMemo());
o.setState("Off");
o.show();
o.recover(c.getMemento());
o.show();
}
}
举例:
打rpg游戏的时候经常在打大boss之前把游戏保存一下,如果死了,就重新来。其实这就是备忘录模式。看代码:
[java] view
plain copy
package designpattern.memento.game;
public class GameRole {
private int vitality;
private int attack;
private int defense;
public GameRole(){
this.vitality = 100;
this.attack = 100;
this.defense = 100;
}
public void showState(){
System.out.println("vitality = " + vitality + "/nattack = " + attack + "/ndefence = " + defense);
}
public RoleStateMemo save(){
return new RoleStateMemo(vitality, attack, defense);
}
public void recover(RoleStateMemo m){
System.out.println("太菜了我,还好我存盘了,哈哈。");
System.out.println("复活中......");
this.vitality = m.getVitality();
this.attack = m.getAttack();
this.defense = m.getDefense();
System.out.println("又复活了.");
}
public void fight(){
System.out.println("与大Boss决战./n......");
System.out.println("你输了, 你的生命,防御, 战斗力都将减为0.");
this.vitality = 0;
this.defense = 0;
this.attack = 0;
}
}
//
package designpattern.memento.game;
public class RoleStateMemo {
private int vitality;
private int attack;
private int defense;
public RoleStateMemo(int v, int a, int d){
this.vitality = v;
this.attack = a;
this.defense = d;
}
public int getVitality() {
return vitality;
}
public void setVitality(int vitality) {
this.vitality = vitality;
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
this.attack = attack;
}
public int getDefense() {
return defense;
}
public void setDefense(int defense) {
this.defense = defense;
}
}
//
package designpattern.memento.game;
public class RoleMemoManager {
private RoleStateMemo m;
public RoleStateMemo getM() {
return m;
}
public void setM(RoleStateMemo m) {
this.m = m;
}
}
//test case
package designpattern.memento.game;
public class Test {
public static void main(String[] args) {
GameRole role = new GameRole();
role.showState();
RoleMemoManager manager = new RoleMemoManager();
manager.setM(role.save());
role.fight();
role.showState();
role.recover(manager.getM());
role.showState();
}
}
适用情景:
需要维护或记录历史的类。
相关文章推荐
- 【代码笔记】iCarouselDemo
- Laravel 学习笔记之语言包 IDE IDE提示工具 IDE插件笔记
- 容器技术适合你的企业吗
- 为什么在Spring的配置里,最好不要配置xsd文件的版本号
- 设计模式读书笔记之单例模式(Singleton)
- 如何实现拼音与汉字的互相转换
- 当PHP随机数遇到最小值是58以后
- 机房水题欢乐赛 2016-04-26 上午
- QVariant
- Bootstrap每天必学之响应式导航、轮播图
- redis的基本类型及操作命令
- 服务器上传,时间超时 Apache 如何设置保持连接
- 设计模式读书笔记之组合模式(Composite)
- 《巴黎圣母院》读后感
- 2Gb_DDR3_SDRAM——16 Meg x 16 x 8 Banks
- 服务器中文件夹权限
- Android多媒体分析(二)MediaStore
- React学习笔记---Props&State
- HTML5的progress元素
- 设计模式读书笔记之桥接模式(bridge pattern)