JavaMementoPattern(備忘錄模式)

凌浩雨發表於2017-09-10

備忘錄模式(Memento Pattern)儲存一個物件的某個狀態,以便在適當的時候恢復物件。備忘錄模式屬於行為型模式。

關鍵程式碼:客戶不與備忘錄類耦合,與備忘錄管理類耦合。

優點: 1、給使用者提供了一種可以恢復狀態的機制,可以使使用者能夠比較方便地回到某個歷史的狀態。 2、實現了資訊的封裝,使得使用者不需要關心狀態的儲存細節。
缺點:消耗資源。如果類的成員變數過多,勢必會佔用比較大的資源,而且每一次儲存都會消耗一定的記憶體。

注意事項: 1、為了符合迪米特原則,還要增加一個管理備忘錄的類。 2、為了節約記憶體,可使用原型模式+備忘錄模式。

  1. 建立 Memento 類。
/**
 * 1. 建立Memento類。
 * @author mazaiting
 *
 */
public class Memento {
    private String state;
    
    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }   
}
  1. 建立 Originator 類。
/**
 * 2. 建立 Originator 類。
 * @author mazaiting
 */
public class Originator {
    
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
    
    public Memento saveStateToMemento(){
        return new Memento(state);
    }
    
    public void getStateFromMemento(Memento memento){
        state = memento.getState();
    }   
}
  1. 建立 CareTaker 類。
/**
 * 3. 建立 CareTaker 類。
 * @author mazaiting
 */
public class CareTaker {
    private List<Memento> mementos = new ArrayList<Memento>();
    
    /**
     * 新增
     */
    public void add(Memento memento) {
        mementos.add(memento);
    }
    
    /**
     * 獲取Memento
     */
    public Memento get(int index){
        return mementos.get(index);
    }
}
  1. 使用 CareTaker 和 Originator 物件。
/**
 * 4. 使用 CareTaker 和 Originator 物件。
 * @author mazaiting
 *
 */
public class Client {
    
    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()); 
    }
}
  1. 列印結果
Current State: State #4
First saved State: State #2
Second saved State: State #3


相關文章