美文网首页
设计模式之备忘录模式

设计模式之备忘录模式

作者: Kevin_小飞象 | 来源:发表于2019-04-12 10:39 被阅读0次

    定义

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

    Android中源码使用备忘录模式

    onSaveInstanceState和onRestoreInstanceState

    特点

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

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

    使用场景

    (1)需要保存一个对象在某一个时刻的状态或部分状态。
    (2)如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态。

    简单实现

    需求:”使命召唤”游戏
    1.备忘录类

    /**
     * Created on 2019/4/12 10:07
     *
     * 备忘录类
     *
     * @author Scarf
     */
    public class Memento {
        public int mCheckpoint;   //武器
    
        public int mLiftValue;    //生命
    
        public String mWeapon;    //关卡
    
        @Override
        public String toString() {
            return "Memento{" +
                    "mCheckpoint=" + mCheckpoint +
                    ", mLiftValue=" + mLiftValue +
                    ", mWeapon='" + mWeapon + '\'' +
                    '}';
        }
    }
    
    1. 游戏类
    /**
     * Created on 2019/4/12 10:11
     *
     * @author Scarf
     */
    public class CallOfDuty {
        private int mCheckpoint = 1;
    
        private int mLifeValue = 100;
    
        private String mWeapon = "沙漠之鹰";
    
        public Memento createMemento() {
            Memento memento = new Memento();
            memento.mCheckpoint = mCheckpoint;
            memento.mLiftValue = mLifeValue;
            memento.mWeapon = mWeapon;
            return memento;
        }
    
        public void play() {
            Log.d("TAG", "玩游戏: " +String.format("第 %d 关",mCheckpoint)+"奋战杀敌中。");
    
            mLifeValue -= 10;
    
            Log.d("TAG", "进度升级了 ");
    
            mCheckpoint++;
    
            Log.d("TAG", "到达" + String.format("第 %d 关",mCheckpoint));
        }
    
        public void quit() {
            Log.d("TAG", "退出当前游戏,属性:" + this.toString());
        }
    
        public void restore(Memento memento) {
            this.mCheckpoint = memento.mCheckpoint;
    
            this.mLifeValue = memento.mLiftValue;
    
            this.mWeapon = memento.mWeapon;
    
            Log.d("TAG", "恢复后的游戏属性:" + this.toString());
        }
    
        @Override
        public String toString() {
            return "CallOfDuty{" +
                    "mCheckpoint=" + mCheckpoint +
                    ", mLifeValue=" + mLifeValue +
                    ", mWeapon='" + mWeapon + '\'' +
                    '}';
        }
    }
    
    
    1. 操作类
    /**
     * Created on 2019/4/12 10:21
     *
     * @author Scarf
     */
    public class Caretaker {
        Memento mMemento;
    
        /**
         * 游戏存档
         * @param memento
         */
        public void archive(Memento memento) {
            this.mMemento = memento;
        }
    
        public Memento getMemento() {
            return mMemento;
        }
    }
    
    1. 使用
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            initData();
        }
    
        private void initData() {
            CallOfDuty game = new CallOfDuty();
            //玩游戏
            game.play();
    
            Caretaker caretaker = new Caretaker();
            caretaker.archive(game.createMemento());  //游戏存档
    
            game.quit();
    
            CallOfDuty newGame = new CallOfDuty();
            newGame.restore(caretaker.getMemento());  //恢复游戏
    
            game.play();
    
            newGame.restore(caretaker.getMemento());
        }
    }
    
    1. 输出结果
    2019-04-12 10:31:46 TAG: 玩游戏: 第 1 关奋战杀敌中。
    2019-04-12 10:31:46 TAG: 进度升级了 
    2019-04-12 10:31:46 TAG: 到达第 2 关
    2019-04-12 10:31:46 TAG: 退出当前游戏,属性:CallOfDuty{mCheckpoint=2, mLifeValue=90, mWeapon='沙漠之鹰'}
    2019-04-12 10:31:46 TAG: 恢复后的游戏属性:CallOfDuty{mCheckpoint=2, mLifeValue=90, mWeapon='沙漠之鹰'}
    2019-04-12 10:31:46 TAG: 玩游戏: 第 2 关奋战杀敌中。
    2019-04-12 10:31:46 TAG: 进度升级了 
    2019-04-12 10:31:46 TAG: 到达第 3 关
    2019-04-12 10:31:46 TAG: 恢复后的游戏属性:CallOfDuty{mCheckpoint=2, mLifeValue=90, mWeapon='沙漠之鹰'}
    

    相关文章

      网友评论

          本文标题:设计模式之备忘录模式

          本文链接:https://www.haomeiwen.com/subject/xsyqwqtx.html