设计模式-备忘录模式(Memento Pattern)

备忘录模式是什么?

备忘录模式又称标记模式。在不破坏封装性的前提下,捕获一个对象的内部状态,并在改对象之外保存这个状态。这样以后就可以将改对象恢复到原先保存的状态,简而言之就是保存一个对象的某个状态,以便在适当的时候恢复对象

备忘录模式的要素

  1. 备忘录角色(Memento):存储备忘发起者的内部状态。
  2. 备忘发起角色(Originator):创建一个备忘录角色,用以保存当前时刻自己内部的状态。在需要的时候使用备忘录恢复内部状态。
  3. 备忘录管理角色(Caretaker):负责保存好备忘录。
设计模式-备忘录模式(Memento Pattern)_第1张图片 白盒备忘录模式

简单例子

package myDesignPatternsTest.mementoPattern;

public class Originator {
    private String state;

    public String getState() {
        return this.state;
    }

    public void setState(String state) {
        System.out.println("NOW STATE IS"+state);
        this.state = state;
    }

    public Memento CrateMemento(){
        return  new Memento(state);
    }
    public void  restoreMemento(Memento memento){
        this.state=memento.getState();
    }
}
package myDesignPatternsTest.mementoPattern;

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;
    }
}
package myDesignPatternsTest.mementoPattern;

public class Caretaker {
    private Memento memento;

    public Memento retieveMemento() {
        return memento;
    }

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

public class Client {
    public static void main(String[] args) {
        Originator originator=new Originator();
        Caretaker caretaker=new Caretaker();
        originator.setState("ON");
        System.out.println(originator.getState());
        caretaker.setMemento(originator.CrateMemento());
        originator.setState("OFF");
        System.out.println(originator.getState());
        originator.restoreMemento(caretaker.retieveMemento());
        System.out.println(originator.getState());
    }
}
NOW STATE ISON
ON
NOW STATE ISOFF
OFF
ON

上面的我们只能存储一种状态。我们改一下代码让存储多种。

package myDesignPatternsTest.mementoPattern;

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

public class Caretaker {
    private List mementoList =new ArrayList();

    public Memento retieveMemento(int dex) {
        return mementoList.get(dex);
    }

    public void setMemento(Memento memento) {

        mementoList.add(memento);
    }
}
package myDesignPatternsTest.mementoPattern;

public class Client {
    public static void main(String[] args) {
        Originator originator=new Originator();
        Caretaker caretaker=new Caretaker();
        originator.setState("ON");
        System.out.println(originator.getState());
        caretaker.setMemento(originator.CrateMemento());
        originator.setState("OFF");
        System.out.println(originator.getState());
        caretaker.setMemento(originator.CrateMemento());
        originator.restoreMemento(caretaker.retieveMemento(1));
        System.out.println(originator.getState());
    }
}
NOW STATE ISON
ON
NOW STATE ISOFF
OFF
OFF

备忘录模式的优缺点

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

缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

你可能感兴趣的:(java,java设计模式之我见)