设计模式(十七):备忘录模式

85 阅读1分钟

介绍

备忘录模式(Memento Pattern)属于行为型模式。保存一个对象的某个状态,以便在适当的时候恢复对象。

优点

  • 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
  • 实现了信息的封装,使得用户不需要关心状态的保存细节

缺点

  • 资源消耗过大

应用

需要保存/恢复数据的相关状态场景:文本编辑器、git

实现

关键代码:客户不与备忘录类耦合,与备忘录管理类耦合

import java.util.ArrayList;
import java.util.List;

class Memento {
    private String state;
  
    public Memento(String state){
       this.state = state;
    }
  
    public String getState(){
       return state;
    }
 }

// 创造者类
 class Originator {
    private String state;
  
    public void setState(String state){
       this.state = state;
    }
  
    public String getState(){
       return state;
    }
  
    public Memento saveStateToMemento(){
       return new Memento(state);
    }
  
    public void getStateFromMemento(Memento Memento){
       state = Memento.getState();
    }
 }

// 管理者类
 class CareTaker {
    private List<Memento> mementoList = new ArrayList<Memento>();
  
    public void add(Memento state){
       mementoList.add(state);
    }
  
    public Memento get(int index){
       return mementoList.get(index);
    }
 }

 class MementoPatternDemo {
    public static void main(String[] args) {
       Originator originator = new Originator();
       CareTaker careTaker = new CareTaker();
       originator.setState("State #1");
       originator.setState("State #2");
       careTaker.add(originator.saveStateToMemento());
       originator.setState("State #3");
       careTaker.add(originator.saveStateToMemento());
       originator.setState("State #4");
  
       System.out.println("Current State: " + originator.getState());    
       originator.getStateFromMemento(careTaker.get(0));
       System.out.println("First saved State: " + originator.getState());
       originator.getStateFromMemento(careTaker.get(1));
       System.out.println("Second saved State: " + originator.getState());
    }
 }
Current State: State #4
First saved State: State #2 
Second saved State: State #3