备忘录模式(Memento)

定义:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

图示:
在这里插入图片描述
Originator(发起者): 负责创建一个备忘录,并且可以记录、恢复自身的内部状态。可以根据需要决定Memento保存自身的那些内部状态
Memento(备忘录): 用于存储Originator的状态,防止Originator以外的的对象访问Memento
Caretaker( 备忘录管理者): 负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象

示例一:

public class Originator {

    private String state;

    /** 创建一个新的备忘录对象 */
    public Memento createMemento(){
        return new Memento(state);
    }

    /** 将发起者的状态恢复到备忘录的状态 */
    public void restore(Memento memento){
        this.state = memento.getState();
    }

}
public class Caretaker {
    private Memento mMemento;

    public Memento restoreMemento(){
        return mMemento;
    }

    public void storeMemengto(Memento memento){
        this.mMemento = memento;
    }
}
public class Memento {
    private String state;

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

    public String getState() {
        return state;
    }

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

示例二:

class Originator {
	private State state;
	public void setState(State state) {
		System.out.println("Originator: Setting state to " + state.toString());
		this.state = state;
	}
	public Memento save() {
		System.out.println("Originator: Saving to Memento.");
		return new Memento(state);
	}
	public void restore(Memento m) {
		state = m.getState();
		System.out.println("Originator: State after restoring from Memento: " + state);
	}
}
class Memento {
	private State state;
	public Memento(State state) {
		this.state = state;
	}
	public State getState() {
		return state;
	}
}
class Caretaker {
	private List<Memento> mementos = new ArrayList<>();
	public void addMemento(Memento m) {
		mementos.add(m);
	}
	public Memento getMemento() {
		return mementos.get(mementos.size()-1);
	}
}
public class Demonstration {
	public static void main(String[] args) {
		Caretaker caretaker = new Caretaker();
		Originator originator = new Originator();
		originator.setState("State1");
		originator.setState("State2");
		caretaker.addMemento( originator.save() );
		originator.setState("State3");
		caretaker.addMemento( originator.save() );
		originator.setState("State4");
		originator.restore( caretaker.getMemento() );
	}
}

总结:
备忘录模式是为了保存对象的内部状态,并在将来恢复,大多数软件提供的保存、打开,以及编辑过程中的Undo、Redo都是备忘录模式的应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值