行为模式涉及到算法和对象间职责的分配。
MEMENTO:在不破坏封装性的前提条下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以恢复这个对象以前的状态。
package behaviour.memento;
/**
* A Caretaker as our test client
*/
import java.io.*;
public class CaretakerTest {
public static void main(String[] args) {
TextOriginator originator = new TextOriginator();
System.out.println("----- Please edit text -----");
System.out.println("Usage: input /"undo/" to undo your edit");
System.out.println("Usage: input /"end/" to end edit");
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(System.in));
String str = "";
while(true) {
str = in.readLine();
if(str.equals("end")) {
System.out.println("----- End edit -----");
break;
} else if(str.equals("undo")) {
originator.setMemento();
} else {
if(! str.equals("")) {
originator.addText(str);
originator.createMemento();
}
}
System.out.println("--Input Text is :" + originator.getText());
}
} catch(IOException e) {
System.out.println("I/O Error !");
System.exit(1);
}
}
}
package behaviour.memento;
/**
* Our test Originator class with Memento class.
* Put 2 class into 1 file, so Memento member can be visited by Originator
*/
import java.io.*;
import java.util.*;
public class TextOriginator {
private StringBuffer strbuf = new StringBuffer();
private String state = "";
private TextMemento memo;
public TextOriginator() {
memo = new TextMemento();
}
public void addText(String addStr) {
state = addStr;
strbuf.append(addStr);
}
public void createMemento() {
memo.addMemo(state);
}
public void setMemento() {
String tmp = memo.getState();
if(tmp != null) {
int start = strbuf.length() - tmp.length();
int end = strbuf.length();
if(start >= 0) {
strbuf.delete(start, end);
} else {
System.out.println("Get Memo Error !");
}
}
}
public String getText() {
return strbuf.toString();
}
}
class TextMemento {
//String state;
int i = 0;
LinkedList memoList;
TextMemento() {
//state = null;
memoList = new LinkedList();
}
void addMemo(String state) {
memoList.addLast(state);
}
String getState() {
if(memoList.size() != 0) {
String tmp = (String)memoList.getLast();
memoList.removeLast();
return tmp;
} else {
return null;
}
}
}