20、行为型-备忘录模式(Memento)

备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象以外保存这个状态,这样能够在之后将对象恢复到原先保存的状态。它是一种对象行为型模式,其别名为Token。

备忘录模式包含以下几个角色:java

●Originator(原发器):它是一个普通类,能够建立一个备忘录,并存储它的当前内部状态,也可使用备忘录来恢复其内部状态,通常将须要保存内部状态的类设计为原发器。
●Memento(备忘录):存储原发器的内部状态,根据原发器来决定保存哪些内部状态。备忘录的设计通常能够参考原发器的设计,根据实际须要肯定备忘录类中的属性。须要注意的是,除了原发器自己与负责人类以外,备忘录对象不能直接供其余类使用,原发器的设计在不一样的编程语言中实现机制会有所不一样。
●Caretaker(负责人):负责人又称为管理者,它负责保存备忘录,可是不能对备忘录的内容进行操做或检查。在负责人类中能够存储一个或多个备忘录对象,它只负责存储对象,而不能修改对象,也无须知道对象的实现细节。

一、主要优势编程

(1)它提供了一种状态恢复的实现机制,使得用户能够方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可使用暂时存储起来的备忘录将状态复原。
(2)备忘录实现了对信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其余代码所改动。备忘录保存了原发器的状态,采用列表、堆栈等集合来存储备忘录对象能够实现屡次撤销操做。

二、主要缺点编程语言

资源消耗过大,若是须要保存的原发器类的成员变量太多,就不可避免须要占用大量的存储空间,每保存一次对象的状态都须要消耗必定的系统资源。

三、适用场景测试

(1)保存一个对象在某一个时刻的所有状态或部分状态,这样之后须要时它可以恢复到先前的状态,实现撤销操做。
(2)防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象。

英雄联盟中的备忘录模式(时空裂痕):this

输入图片说明

/**
 * 2018/12/6
 * StateOriginator
 *
 * @author machuanpeng
 */
public class StateOriginator {

    private String time;
    
    private String event;
 
    public StateOriginator(){}
 
  // 建立一个备忘录对象
    public Memento createMemento() {
    return new Memento(this);
    }
 
  // 根据备忘录对象恢复原发器状态
    public void restoreMemento(Memento memento) {
     this.time = memento.getTime();
        this.event = memento.getEvent();
    }
}
/**
 * 2018/12/6
 * Memento
 *
 * @author machuanpeng
 */
public class Memento {  
  
    private String time;
    
    private String event;
      
    public Memento(StateOriginator originator) {  
     this.time = originator.getTime();
        this.event = originator.getEvent(); 
    }  
}
/**
 * 2018/12/6
 * Caretaker
 *
 * @author machuanpeng
 */

public class Caretaker {
    
	private Memento memento;
 
	public Memento getMemento() {
		return this.memento;
	}
 
	public void setMemento(Memento memento) {
		this.memento=memento;
	}
}

测试:设计

public class Client {
	public static void main(String args[]) {
        // 建立原始类  
        StateOriginator originator = new StateOriginator();  
  		originator.setTime("2018-12-10 17:07:00");
        originator.setEvent("蓝方在打大龙");
        // 建立备忘录  
        Memento memento = originator.createMemento();  
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(memento);
        System.out.println("初始化状态为:"+originator.getTime()+originator.getEvent()); 
        // 修改原始类的状态  
        originator.setTime("2018-12-10 17:10:00");
        originator.setEvent("红方在打小龙");
        System.out.println("修改后的状态:"+originator.getTime()+originator.getEvent()); 
        // 回复原始类的状态  
        originator.restoreMemento(caretaker.getMemento());  
        System.out.println("恢复后的状态:"+originator.getTime()+originator.getEvent());
	}
}
相关文章
相关标签/搜索