• 设计模式第20篇:备忘录模式


    一.备忘录模式介绍

      备忘录模式可以理解成存档模式,比如玩游戏闯关,每过一关游戏都会将当前关数存档,当闯关失败再次开始时游戏会进入上次最新的游戏进度,这里面游戏失败时存档、重新开始时将上次存档进度恢复就是备忘录模式的工作流程。

      备忘录模式一般有三个角色,备忘录角色、发起人角色、负责人角色:

      1.备忘录角色:保存发起人对象的内部状态,同时得防止除发起人以外对象的访问。

      2.发起人角色:创建备忘录对象,以保存自己最新的状态,同时可以状态恢复到备忘录中保存的状态。

      3.负责人角色:负责保存和提取备忘录对象。

    二.备忘录模式代码用例

      为了防止备忘录对象保存的发起人的状态不被除发起人以外的对象访问,备忘录类通常不能是普通类(当然,如果对备忘录类的访问权限没有这个要求则另当别论),这里将备忘录类设计成发起人对象的内部类,然后实现一个备忘录类空接口,该接口里面没有任何方法。

      1.备忘录接口

    interface MementoIF{
    }

      2.发起人角色

    class Originator{
        private String state;
        private MementoIF memento;
        public void setState(String state){
            this.state=state;
        }
        public String getState(){
            return state;
        }
        public Memento createMemento(){
            return new Memento(this.state);
        }
        public void restoreMemento(MementoIF memento){
             setState(((Memento)memento).getState());
        }
        private class Memento implements MementoIF{
            private String state;
            private Memento(String state){
                this.state=state;
            }
            private String getState(){
                return state;
            }
        }
    }

      3.负责人(管理人)角色

    class Manager{
        private MementoIF memento;
        public void saveMemento(MementoIF memento){
            this.memento=memento;
        }

      //由于MementoIF是空接口,所以获取不到备忘录对象的方法
    public MementoIF retireveMemento(){ return memento; } }

      4.测试

    public class MementoTest{
        public static void main(String[] args){
            Originator o=new Originator();
            Manager m=new Manager();
            o.setState("on");
            m.saveMemento(o.createMemento());
            o.setState("off");
            System.out.println(o.getState());
            o.restoreMemento(m.retireveMemento());
            System.out.print(o.getState());
        }
    
    }

    三.备忘录模式适用场景

      在游戏的存档和读档、文档的保持和恢复、版本的更新和回退等。

  • 相关阅读:
    Dumps for Dummies Dump Analysis Tutorial
    WCF 学习资料
    winform 跨线程设置或读取控件的属性
    反射通过属性名得到属性的值
    C# 不用循环填充数组
    反射字符串调用方法
    使用反射打开窗体,并控制一个窗体只能打开一个
    绘制圆角窗体和圆角panel
    WinForm使用反射通过控件的name得到该控件
    winfrom 绘制圆形按钮
  • 原文地址:https://www.cnblogs.com/quxiangxiangtiange/p/10320974.html
Copyright © 2020-2023  润新知