zoukankan      html  css  js  c++  java
  • Java设计模式十五:备忘录模式(Memento)

    备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,属于行为模式。它是在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。

    类图:


    组成部分:
    发起人(Originator): 负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。发起人可以根据需要觉得备忘录存储自己的哪些内部状态。
    备忘录(Memento): 负责存储发起人对象的内部状态,并可以防止发起人以外的其他对象访问备忘录。备忘录有两个接口:管理者只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。发起人却可以看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
    管理者(Caretaker): 负责备忘录,不能对备忘录的内容进行访问或者操作。

    实例:以保存游戏进度为例,在游戏角色大战Boss前将该角色的状态存储,与Boss作战后角色的各项能力会下降,如果没有通关,则可利用备忘录进行恢复到战前状态。

    public class Memento
    {
        private int vitality;
        private int aggressivity;
        private int defencivity;

        public int getVitality()
        {
            return vitality;
        }

        public void setVitality(final int vitality)
        {
            this.vitality = vitality;
        }

        public int getAggressivity()
        {
            return aggressivity;
        }

        public void setAggressivity(final int aggressivity)
        {
            this.aggressivity = aggressivity;
        }

        public int getDefencivity()
        {
            return defencivity;
        }

        public void setDefencivity(final int defencivity)
        {
            this.defencivity = defencivity;
        }
    }


    public class PlayerOriginator
    {
        private int vitality; //生命力
        private int aggressivity; //攻击力
        private int defencivity; //防御力

        public PlayerOriginator(final int vitality, final int aggressivity, final int defencivity)
        {
            this.vitality = vitality;
            this.aggressivity = aggressivity;
            this.defencivity = defencivity;
        }

        public int getVitality()
        {
            return vitality;
        }

        public void setVitality(final int vitality)
        {
            this.vitality = vitality;
        }

        public int getAggressivity()
        {
            return aggressivity;
        }

        public void setAggressivity(final int aggressivity)
        {
            this.aggressivity = aggressivity;
        }

        public int getDefencivity()
        {
            return defencivity;
        }

        public void setDefencivity(final int defencivity)
        {
            this.defencivity = defencivity;
        }

        public Memento createMemento()
        {
            final Memento memento = new Memento();
            memento.setVitality(this.vitality);
            memento.setAggressivity(this.aggressivity);
            memento.setDefencivity(this.defencivity);
            return memento;
        }

        public void setMemento(final Memento memento)
        {
            this.vitality = memento.getVitality();
            this.aggressivity = memento.getAggressivity();
            this.defencivity = memento.getDefencivity();
        }

        public void showState()
        {
            System.out.print("vitality:" + this.vitality);
            System.out.print("; aggressivity:" + this.aggressivity);
            System.out.println("; defencivity:" + this.defencivity);
        }
    }

    public class Caretaker
    {
        private Memento memento;

        public Memento getMemento()
        {
            return memento;
        }

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

    public class Client
    {
        public static void main(final String[] args)
        {
            final PlayerOriginator player = new PlayerOriginator(100, 100, 100);
            System.out.print("player's original attributes are ");
            player.showState();

            final Caretaker taker = new Caretaker();
            taker.setMemento(player.createMemento());

            player.setVitality(70);
            player.setAggressivity(60);
            player.setDefencivity(20);

            System.out.print("after player fight with Boss, player's attributes are ");
            player.showState();

            //reset player's attribute
            player.setMemento(taker.getMemento());
            System.out.print("after resetting, player's attributes are ");
            player.showState();

        }

    }

    结果:
    player's original attributes are vitality:100; aggressivity:100; defencivity:100
    after player fight with Boss, player's attributes are vitality:70; aggressivity:60; defencivity:20
    after resetting, player's attributes are vitality:100; aggressivity:100; defencivity:100

  • 相关阅读:
    (转)simple-framework(MaliSDK框架分析)
    (转)libhybris及EGL Platform-在Glibc生态中重用Android的驱动
    (原)在firefly_rk3288开发板上解决openGL在设置32位色深以后出现花屏的问题
    参考论坛:Mali kernel driver TX011-SW-99002-r5p1-00rel0 for firefly
    (转)android媒体--stagefright概述【一】
    (转)android系统架构及源码目录结构
    (原)linux下利用cmake来编译jthread开源库
    (原)U盘可见容量不能被识别的处理方法
    学会阅读Java字节码
    JVM
  • 原文地址:https://www.cnblogs.com/itTeacher/p/2814814.html
Copyright © 2011-2022 走看看