定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
//先构建备忘录
package com.md.memorand;
import java.util.List;
//备忘录 (记忆)
public class Memory {
private List <String> storyList;
public List <String> getStoryList() {
return storyList;
}
public void setStoryList(List <String> storyList) {
this.storyList = storyList;
}
}
//灵魂(管理记忆)
package com.md.memorand;
import java.util.HashMap;
import java.util.Map;
public class Soul {
private Map <Person, Memory> memoryMap = new HashMap <Person, Memory>();
//抽离或者说搜集一个人的记忆
public void pullAwayMemory(Person person){
memoryMap.put(person, person.getMemory());
}
//强行将一个人的记忆固定在某一刻
public void forceFixMemory(Person person){
if (memoryMap.containsKey(person)) {
person.setMemory(memoryMap.get(person));
}
}
}
//人类的记忆
package com.md.memorand;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
//人类 发起人
public class Person {
private String name;
private List <String> storyList;
public Person(String name) {
this.name = name;
storyList = new ArrayList <String>();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List <String> getStoryList() {
return Collections.unmodifiableList( storyList );
}
public void addStory(String history) {
this.storyList.add( history );
}
/* 新增 */
//获取记忆
public Memory getMemory() {
Memory memory = new Memory();
memory.setStoryList( new ArrayList <String>( storyList ) );
return memory;
}
//恢复记忆
public void setMemory(Memory memory) {
storyList = memory.getStoryList();
}
/* 新增 */
public String toString() {
StringBuffer stringBuffer = new StringBuffer( name + "的记忆:\n" );
for (String memory : storyList) {
stringBuffer.append( memory ).append( "\n" );
}
return stringBuffer.toString();
}
}
package com.md.memorand;
public class Main {
public static void main(String[] args) {
Soul soul = new Soul();
Person personA = new Person("看守所人员A");
Person personB = new Person("看守所人员B");
//看守所人员A的记忆
personA.addStory("小时候偷换男女厕所的牌子");
personA.addStory("用裤衩上的猴皮筋做成弹弓打别人家玻璃,结果被弹了小JJ");
//看守所人员B的记忆
personB.addStory("小时候比谁尿的更高更远,我得了第一,只是不小心方向变成了直上直下,尿到了自己脸上");
personB.addStory("有一次正上课,不小心放了个屁,结果带出了点杂物,满教室都是臭味熏天");
System.out.println(personA);
System.out.println(personB);
//灵魂(管理者)抽离两个人之前的记忆
soul.pullAwayMemory(personA);
soul.pullAwayMemory(personB);
//两个人看到了小左的技能和面貌
personA.addStory("有一个人竟然可以飞行,记忆中还记得他的样貌");
personB.addStory("有一个人竟然可以飞行,记忆中还记得他的样貌");
System.out.println(personA);
System.out.println(personB);
//强行恢复记忆
soul.forceFixMemory(personA);
soul.forceFixMemory(personB);
System.out.println(personA);
System.out.println(personB);
}
}
1、发起人备份自己的状态不需要自己管理,可以备份到外部,这样可以很好的保持封装的边界,这样做的意义在于可以给外部提供一个简单的操作该对象内部状态的接口。保持封装的边界这应该算是最重要的优点了。
2、发起人状态的备份与恢复,发起人自身不需要管理与操作,而是由客户端自行按需要处理。
3、如果发起人的状态出现问题,可以很轻松的恢复。
Person-->Memory
Soul-->Person