package net.liuyx.test;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import net.liuyx.test.FamousPlace.Memento;
public class MementoTest {
public static void main(String[] args) {
Person p1 = new Person();
p1.setName("张三");
p1.setAge(23);
p1.setGender("男");
p1.setCareer("程序员");
Person p2 = new Person();
p2.setName("李四");
p2.setAge(33);
p2.setGender("男");
p2.setCareer("建筑师");
Person p3 = new Person();
p3.setName("王丽");
p3.setAge(21);
p3.setGender("女");
p3.setCareer("设计师");
FamousPlace o = new FamousPlace();
o.visit(p1);
Memento m = o.createMememto();
o.printRecordPerson();
o.visit(p2);
o.printRecordPerson();
o.stopRecord();
o.visit(p3);
o.printRecordPerson();
o.printAllVisitPersons();
o.printLastestPeson();
Caretaker c = new Caretaker();
c.storeToMemento(m);
o.visit(c.restoreFromMemento());
o.printRecordPerson();
}
}
class Person implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private transient String gender;
private int age;
private String career;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCareer() {
return career;
}
public void setCareer(String career) {
this.career = career;
}
@Override
public String toString() {
return "Person [name=" + name + ", gender=" + gender + ", age=" + age
+ ", career=" + career + "]";
}
}
class FamousPlace implements Serializable{
private static final long serialVersionUID = 1L;
private Person person;
private Memento memento;
private boolean stopRecord = false;
public Memento createMememto() {
return memento = new Memento(person);
}
public void stopRecord() {
stopRecord = true;
}
public void printRecordPerson() {
if(person.getGender() == null || person.getGender().equals(""))
person.setGender("未知性别");
System.out.println("The record person visit here is :" + person.getName() + "," + person.getGender());
}
public void printAllVisitPersons() {
memento.printAllPersons();
}
public void printLastestPeson() {
System.out.println("The latest person visit here is :" + person.getName() + "," + person.getGender());
}
public void visit(Person person) {
this.person = person;
if (memento != null && !stopRecord) {
memento.persons.add(person);
}
}
public class Memento implements Serializable{
private static final long serialVersionUID = 1L;
private List<Person> persons = new ArrayList<Person>();
private Person theLastPerson;
public Memento(Person person) {
theLastPerson = person;
if(!stopRecord)
persons.add(person);
}
private void printAllPersons() {
if (persons != null) {
for (Person person : persons) {
System.out.println(person.getName());
}
}
else
System.out.println("No one visit here!");
}
public Person getTheLastPerson() {
return theLastPerson;
}
}
}
class Caretaker {
private File file;
public void storeToMemento(Memento memento) {
file = new File("F:\\mem.txt");
ObjectOutputStream out = null;
try {
FileOutputStream fos = new FileOutputStream(file);
out = new ObjectOutputStream(fos);
out.writeObject(memento);
out.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
closeStream(out);
}
}
public Person restoreFromMemento() {
Memento m = null;
ObjectInputStream in = null;
try {
in = new ObjectInputStream(new FileInputStream("F:\\mem.txt"));
m = (Memento)in.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
closeStream(in);
}
return m.getTheLastPerson();
}
private void closeStream(Closeable c) {
if(c != null) {
try {
c.close();
} catch (IOException ignore) {
}
}
}
}