备忘录模式

来源:互联网 发布:everest是什么软件 编辑:程序博客网 时间:2024/06/05 11:39

定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。

/** * @author android3 *  模拟运行流程A的对象的备忘录接口,是个窄接口 */public interface FlowAMockMemento {      }

public class FlowAMock {     /**     *流程名称,不需要外部存储的状态数据      */    private String flowName;     /**     * 示意,代表某个中间结果,需要外部存储的状态数据     */    private int tempResult;     /**     * 示意,代表某个中间结果,需要外部存储的状态数据     */    private String tempState;            public FlowAMock(String flowName){    this.flowName = flowName;    }         /**     * 示意,运行流程的第一个阶段     */    public void runPhaseOne(){    tempResult = 3;    tempState = "PhaseOne";    }                /**     * 示意,按照方案一来运行流程后半部分     */    public void schema1(){    //示意,需要使用第一阶段产生的数据    this.tempState += ":schema 1";    System.out.println(this.tempState +" now run "+ tempResult);    this.tempResult += 11;    }            /**     * 示意,按照方案二来运行流程后半部分     */    public void schema2(){    this.tempState +=": schema2";    System.out.println(this.tempState +" now run "+ tempResult );    this.tempResult += 22;    }            /**     * 创建备忘录对象,保存对象的状态     */    public FlowAMockMemento createMemento(){    return new MementoImpl(this.tempResult, this.tempState);        }            /**     * 回复到备忘录记录的状态     */    public void setMemento(FlowAMockMemento memento){    MementoImpl mementoImpl = (MementoImpl) memento;        this.tempResult = mementoImpl.getTempResult();        this.tempState  = mementoImpl.getTempState();    }                /**     * @author android3     * 备忘录对象     */    private static class MementoImpl implements FlowAMockMemento{    /**     * 示意,保存某个中间结果     */    private int tempResult;        /**     * 示意,保存某个中间结果     */    private String tempState;        public MementoImpl(int tempResult,String tempState){    this.tempResult = tempResult;    this.tempState = tempState;    }            public int getTempResult(){    return this.tempResult;    }        public String getTempState(){    return this.tempState;    }     }       }

public class FlowAMementoCareTaker {    /**     *记录被保存的备忘录对象      */    private FlowAMockMemento memento = null;            /**     * 保存备忘录对象     */    public void saveMemento(FlowAMockMemento memento ){    this.memento = memento;    }        /**     * 获取被保存的备忘录对象     */    public FlowAMockMemento retriveMemento(){    return this.memento;    }}

public class Client {      public static void main(String args[]){      FlowAMock mock = new  FlowAMock("test flow");      mock.runPhaseOne();       //创建备忘录对象      FlowAMockMemento memento = mock.createMemento();       FlowAMementoCareTaker careTaker = new FlowAMementoCareTaker();      //保存备忘录对象       careTaker.saveMemento(memento);      mock.schema1();       //恢复并重置备忘录对象      mock.setMemento(careTaker.retriveMemento());          mock.schema2();         }}

 


备忘录的离线存储:(应用场景:系统崩溃之恢复等)


public interface FlowAmockMemento extends Serializable {      }

public class FlowAMementoFileCareTaker {public void saveMemento(FlowAmockMemento memento){ObjectOutputStream oos =null;try{oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("FlowAMemento")));oos.writeObject(memento);}catch(Exception err){err.printStackTrace();}finally{try{oos.close();}catch(Exception e){e.printStackTrace();}}}public FlowAmockMemento retriveMemento(){FlowAmockMemento memento = null;ObjectInputStream ois = null;try{ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("FlowAMemento")));memento = (FlowAmockMemento) ois.readObject();}catch(Exception e){e.printStackTrace();}finally{try{ois.close();}catch(IOException e){e.printStackTrace();}}return memento;} }









0 0
原创粉丝点击