【设计模式】—— 备忘录模式Memento

  前言:【模式总览】——————————by xingoohtml

  模式意图

  这个模式主要是想经过一个对象来记录对象的某种状态,这样有利于在其余须要的场合进行恢复。设计模式

  该模式还有跟多能够扩展的地方,好比能够记录多个时间的状态,每一个角色都有能够扩展的空间,彻底看业务场景而定。ide

  应用场景this

  1 保存对象某一时刻的状态spa

  2 避免直接暴露接口,破坏封装性设计

  模式结构

  Originator 是备忘录的发起者,记录状态的对象rest

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 备忘录角色,一般用于保存某种状态code

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 备忘录的负责人,负责在恰当的时机,进行状态的恢复htm

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()); } }
View Code

  运行结果

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 }
View Code

  运行结果

女仆写笔记 ****主人正在...睡觉吃饭打豆豆! 女仆拿到笔记本 读笔记! 主人看到笔记,记起了 晚上6点,配小丽看电影 ****主人正在...晚上6点,配小丽看电影
相关文章
相关标签/搜索