1. 程式人生 > >java 行為模式 備忘錄模式

java 行為模式 備忘錄模式

意圖

在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態

適用性

必須儲存一個物件在某一個時刻的(部分)狀態, 這樣以後需要時它才能恢復到先前的狀態。

備忘錄模式的構成

1 備忘錄(Memento)角色:保持原發器(Originator)的內部狀態,根據原發器來決定儲存哪些內部的狀態。

  備忘錄可以有效地利用兩個介面。看管者只能呼叫狹窄(功能有限)的介面——它只能傳遞備忘錄給其他物件。而原發器可以呼叫一個寬闊(功能強大)的介面,通過這個介面可以訪問所有需要的資料,使原發器可以返回先前的狀態。

2 原發器(Originator)角色:建立一個備忘錄,記錄它的當前內部狀態。可以利用一個備忘錄來恢復它的內部狀態

3 看管者(Caretaker)角色:只負責看管備忘錄。不可以對備忘錄的內容操作或者檢查 



備忘錄角色

package Memento;

/**
 * 備忘錄
 */
public class Memento {

    private String name;
    private String age;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public Memento(String age, String name){
        this.name=name;
        this.age = age;
    }




}

原發器角色
package Memento;

public class Originator {

    private String name;
    private String age;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return String.format("name:%s age:%s", name, age);
    }

    /**
     * @param age
     * @param name
     * @return
     */
    public Memento createMemento(String age,String name){
        return new Memento(age,name);
    }


    public void restoreMemento(Memento memento){
        this.name = memento.getName();
        this.age = memento.getAge();
    }

}

看管者
package Memento;
public class Caretaker {

    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

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

測試
package Memento;

public class Client {
    public static void main(String[] args) {



        Originator or = new Originator();
        or.setAge("12");
        or.setName("liming");

        System.out.println(or.toString());

        Caretaker c = new Caretaker();
        Memento me = or.createMemento(or.getAge(),or.getName());
        c.setMemento(me);

        or.setName("lilei");
        or.setAge("23");
        System.out.println(or.toString());
        System.out.println("-----------restore");
        or.restoreMemento(c.getMemento());
        System.out.println(or.toString());
    }
}
列印結果
name:liming age:12
name:lilei age:23
-----------restore
name:liming age:12