行为模式-备忘录模式

备忘录模式:又称快照模式。

备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。它的用以是在不破坏封装条件下 将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来某个时候把这个对象还原到存储起来的状态。

它有三个角色:

 发起人(Originator)角色的职责:

1.创建一个含有当前的内部状态的备忘录对象。

2.使用备忘录对象存储其内部状态。

package com.javapatterns.memento.theory;

public class Originator
{
    private String state;

    public Memento createMemento()
    {
        return new Memento(state);
    }

    public void restoreMemento(Memento memento)
    {
        this.state = memento.getState();
    }

    public String getState()
    {
        return this.state;
    }

    public void setState(String state)
    {
        this.state = state;
        System.out.println("Current state = " + this.state);
    }
}

 

备忘录(Memento)角色的职责:
1.将发起人(Originator)对象的内部状态存储起来。
2.保护其内容不被发起人(Originator)对象之外的任何对象所读取。提供了两个等效的接口:
     窄接口:负责人(Caretaker)对象(和其他除发起人对象之外的任何对象)看到的是备忘录的窄接口(narrow interface),这个窄接口只允许它把备忘录对象传给其他的对象。
     宽接口:发起人(Originator)对象可以看到一个宽接口(wide interface),这个宽接口允许它读取所有的数据,以便根据这些数据恢复发起人对象的内部状态。

package com.javapatterns.memento.theory;

public class Memento
{
    private String state;

    public Memento(String state)
    {
        this.state = state;
    }

    public String getState()
    {
        return this.state;
    }

    public void setState(String state)
    {
        this.state = state;
    }
}

 

负责人(Caretaker)角色的职责: 
1.负责保存备忘录对象。 
2.不查看或修改备忘录对象的内容。

      

package com.javapatterns.memento.theory;

public class Caretaker
{
    /**
     * @link aggregation 
     * @label narrow
     */
    private Memento memento;

    public Memento retrieveMemento()
    {
        return this.memento;
    }

    public void saveMemento(Memento memento)
    {
     	this.memento = memento;
    }
}

 客户端:

 

package com.javapatterns.memento.theory;

public class Client
{
    private static Originator o = new Originator();
    private static Caretaker c = new Caretaker();

    public static void main(String[] args)
    {
        o.setState("On");

	    // Store internal state
	    c.saveMemento( o.createMemento() );
	
	    // Continue changing originator
	    o.setState("Off");

	    // Restore saved state
	    o.restoreMemento( c.retrieveMemento() );

    }
}

 

上面这个负责人只能保存单个快照,使用下面这个类 可以保存多个状态:

package com.javapatterns.memento.theory;

import java.util.Vector;

//多记录集(记录管理)   
public class Caretaker2 {
	private Originator originator;
	private Vector<Memento> mementos = new Vector<Memento>();
	private int total;

	public Caretaker2(Originator originator) {
		this.originator = originator;
		total = 0;
	}

	public void createMemento() { // 创建
		Memento memento = this.originator.createMemento();
		mementos.addElement(memento);
		total++;
	}

	public void saveMemento(Memento memento) {// 保存记录
		mementos.addElement(memento);
		total++;
	}

	public void retrieveMemento(int index) { // 获取
		Memento memento = (Memento) mementos.elementAt(index);
		originator.restoreMemento(memento);
	}

	public void removeMemento(int index) {// 删除
		mementos.removeElementAt(index);
		total--;
	}
}

 

你可能感兴趣的:(C++,c,C#)