定义:java
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象以外保存这个状态。这样就能够将该对象恢复到原先保存的状态git
类型:行为型模式 github
顺口溜:中访策备迭 观模命状职解this
发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责建立和恢复备忘录数据。spa
备忘录:负责存储发起人对象的内部状态,在须要的时候提供发起人须要的内部状态。code
管理角色:对备忘录进行管理,保存和提供备忘录。orm
package com.amosli.dp.behavior.memento; /** * 备忘录 * @author amosli * */ public class Memento { private String state; public String getState() { return state; } public void setState(String state) { this.state = state; } public Memento(String state) { this.state = state; } } package com.amosli.dp.behavior.memento; /** * 发起人 * @author amosli * */ public class Originator { private String state; public String getState() { return state; } public void setState(String state) { this.state = state; } public void setMemento(Memento memento) { state = memento.getState(); } public Memento createMemento() { return new Memento(state); } public void show(){ System.out.println(state); } } package com.amosli.dp.behavior.memento; /** * 管理者 * @author amosli * */ public class Caretaker { private Memento memento; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento = memento; } } package com.amosli.dp.behavior.memento; public class Client { public static void main(String[] args) { Originator originator = new Originator(); originator.setState("start"); originator.show(); Memento memento = originator.createMemento(); Caretaker caretaker = new Caretaker(); caretaker.setMemento(memento); originator.setState("over"); originator.show(); originator.setMemento(caretaker.getMemento()); originator.show(); } }
一、 须要保存一个对象在某一个时刻的状态或部分状态。对象
二、 若是用一个接口来让其余对象获得这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不但愿外界直接访问其内部状态,经过负责人能够间接访问其内部状态。接口
一、有时一些发起人对象的内部信息必须保存在发起人对象之外的地方,可是必需要由发起人对象本身读取,这时,ci
使用备忘录模式能够把复杂的发起人内部信息对其余的对象屏蔽起来,从而能够恰当地保持封装的边界。
二、本模式简化了发起人类。发起人再也不须要管理和保存其内部状态的一个个版本,客户端能够自行管理他们所需
要的这些状态的版本。
三、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可使用暂时存储起来的备忘录将状态复原。
一、若是发起人角色的状态须要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
二、当负责人角色将一个备忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而没法提醒用户一个操做是否很昂贵。
三、当发起人角色的状态改变的时候,有可能这个协议无效。若是状态改变的成功率不高的话,不如采起“假如”协议模式。
本系列文章源码地址,https://github.com/amosli/dp 欢迎Fork & Star !!