常见设计模式之Memento模式

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) {
	    }
	}
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值