模式意图
这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复。
该模式还有跟多可以扩展的地方,比如可以记录多个时间的状态,每个角色都有可以扩展的空间,完全看业务场景而定。
应用场景
1 保存对象某一时刻的状态
2 避免直接暴露接口,破坏封装性
模式结构
Originator 是备忘录的发起者,记录状态的对象
class Originator{ private String state; public Memento ceateMemento() { return new Memento(state); } public void restoreMemento(Memento memento) { this.state = memento.getState(); } public String getState(){ return this.state; } public void setState(String state){ this.state = state; System.out.println("Current state = "+this.state); } }
Memento 备忘录角色,通常用于保存某种状态
class Memento{ private String state; public Memento(String state) { this.state = state; } public String getState() { return state; } public void setState(String state) { this.state = state; } }
Caretaker 备忘录的负责人,负责在恰当的时机,进行状态的恢复
class Caretaker{ private Memento memento; public Memento retrieveMemento(){ return this.memento; } public void saveMemento(Memento memento){ this.memento = memento; } }
全部代码
package com.xingoo.test.design.memento; class Originator{ private String state; public Memento ceateMemento() { return new Memento(state); } public void restoreMemento(Memento memento) { this.state = memento.getState(); } public String getState(){ return this.state; } public void setState(String state){ this.state = state; System.out.println("Current state = "+this.state); } } class Memento{ private String state; public Memento(String state) { this.state = state; } public String getState() { return state; } public void setState(String state) { this.state = state; } } class Caretaker{ private Memento memento; public Memento retrieveMemento(){ return this.memento; } public void saveMemento(Memento memento){ this.memento = memento; } } public class Client { private static Originator o = new Originator(); private static Caretaker c = new Caretaker(); public static void main(String[] args) { o.setState("On"); //记录状态 c.saveMemento(o.ceateMemento()); //更改状态 o.setState("Off"); //更新状态 o.restoreMemento(c.retrieveMemento()); } }
运行结果
Current state = On Current state = Off
生活中的设计模式
最近看了会 恶魔奶爸,挺扯淡的漫画。不过看到其中的女仆,让我想起了这种备忘录模式。
主人在有什么重要的事情时,都会交给女仆记着,规定的时间在提醒自己。
下面的主人就有一件很重要的事情,就是陪亲爱的小丽去看电影,于是他弄了一个笔记本,记录下了这个信息。女仆拿到笔记本,并在预先商量好的时间提醒主人。这里的笔记本就是上面的备忘录对象Memento,而这个模式中,主人就是备忘录的发起者,女仆是负责人。
这里涉及到的备忘录是属于【白箱】的,也就是说,备忘录中的信息,可以被发起人和负责人看到。还有一种是【黑箱】的,主要是用了一种内部类继承这个备忘录对象,这样外部的负责人就得不到真正备忘录中的具体信息。
下面看下具体的实现,主人的代码如下:
1 class Master{ 2 private String info; 3 public String getInfo() { 4 return info; 5 } 6 public void setInfo(String info) { 7 this.info = info; 8 } 9 public Note createNote(String info){ 10 return new Note(info); 11 } 12 public void action(Note note){ 13 this.info = note.getInfo(); 14 System.out.println("主人看到笔记,记起了 "+ this.info); 15 } 16 public void toDo(){ 17 System.out.println("****主人正在..."+info); 18 } 19 }
女仆的代码如下:
1 class Maid{ 2 private Note note; 3 public Note readNote(){ 4 System.out.println("女仆拿到笔记本"); 5 return this.note; 6 } 7 public void writeNote(Note note){ 8 System.out.println("女仆写笔记"); 9 this.note = note; 10 } 11 }
备忘录的代码如下:
1 class Note{ 2 private String info; 3 public Note(String info) { 4 this.info = info; 5 } 6 public void setInfo(String info){ 7 this.info = info; 8 System.out.println("写笔记!"); 9 } 10 public String getInfo(){ 11 System.out.println("读笔记!"); 12 return info; 13 } 14 }
全部代码:
1 package com.xingoo.test.design.memento; 2 class Note{ 3 private String info; 4 public Note(String info) { 5 this.info = info; 6 } 7 public void setInfo(String info){ 8 this.info = info; 9 System.out.println("写笔记!"); 10 } 11 public String getInfo(){ 12 System.out.println("读笔记!"); 13 return info; 14 } 15 } 16 class Master{ 17 private String info; 18 public String getInfo() { 19 return info; 20 } 21 public void setInfo(String info) { 22 this.info = info; 23 } 24 public Note createNote(String info){ 25 return new Note(info); 26 } 27 public void action(Note note){ 28 this.info = note.getInfo(); 29 System.out.println("主人看到笔记,记起了 "+ this.info); 30 } 31 public void toDo(){ 32 System.out.println("****主人正在..."+info); 33 } 34 } 35 class Maid{ 36 private Note note; 37 public Note readNote(){ 38 System.out.println("女仆拿到笔记本"); 39 return this.note; 40 } 41 public void writeNote(Note note){ 42 System.out.println("女仆写笔记"); 43 this.note = note; 44 } 45 } 46 public class LifeWithMaid { 47 public static void main(String[] args) { 48 Master master = new Master(); 49 Maid maid = new Maid(); 50 //主人想起了要做的事情 51 maid.writeNote(master.createNote("晚上6点,配小丽看电影")); 52 //主人忙其他的事情 53 master.setInfo("睡觉吃饭打豆豆!"); 54 master.toDo();//主人正在做什么? 55 //时间到了,女仆提醒主人 56 master.action(maid.readNote()); 57 master.toDo();//主人正在做什么? 58 } 59 }
运行结果
女仆写笔记 ****主人正在...睡觉吃饭打豆豆! 女仆拿到笔记本 读笔记! 主人看到笔记,记起了 晚上6点,配小丽看电影 ****主人正在...晚上6点,配小丽看电影
本文转自博客园xingoo的博客,原文链接:【设计模式】—— 备忘录模式Memento,如需转载请自行联系原博主。
时间: 2024-10-28 20:46:51