设计模式

备忘录模式(Memoto)

2020-07-22  本文已影响0人  秀儿2020

定义

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

本质

保存和回复内部状态。

登场角色

示例代码

/**
 * 生成者,即需要被保存的对象
 */
public class CallOfDuty {
    private int mCheckPoint = 1;
    private int mLifeValue = 100;
    private String mWeapon = "沙漠之鹰";

    /**
     * 玩游戏
     */
    public void play(){
        System.out.println("玩游戏:" + String.format("第%d关",mCheckPoint));
        mLifeValue = mCheckPoint - 10;
        System.out.println("进度升级");
        mCheckPoint++;
        System.out.println("到达:" + String.format("第%d关",mCheckPoint));
    }

    /**
     * 退出游戏
     */
    public void quit(){
        System.out.println("==============");
        System.out.println("退出游戏前的属性:" + this.toString());
        System.out.println("退出游戏");
        System.out.println("==============");
    }

    /**
     * 创建备忘录
     */
    public Memoto createMemoto(){
        Memoto memoto = new Memoto();
        memoto.mCheckPoint = mCheckPoint;
        memoto.mLifeValue = mLifeValue;
        memoto.mWeapon = mWeapon;
        return memoto;
    }

    /**
     * 恢复游戏
     */
    public void restore(Memoto memoto){
        this.mCheckPoint = memoto.mCheckPoint;
        this.mLifeValue = memoto.mLifeValue;
        this.mWeapon = memoto.mWeapon;
        System.out.println("恢复后的游戏属性:" + this.toString());
    }

    @Override
    public String toString() {
        return "CallOfDuty{" +
                "mCheckPoint=" + mCheckPoint +
                ", mLifeValue=" + mLifeValue +
                ", mWeapon='" + mWeapon + '\'' +
                '}';
    }
}



public class Memoto {
    public int mCheckPoint;
    public int mLifeValue;
    public String mWeapon;

    @Override
    public String toString() {
        return "Memoto{" +
                "mCheckPoint=" + mCheckPoint +
                ", mLifeValue=" + mLifeValue +
                ", mWeapon='" + mWeapon + '\'' +
                '}';
    }
}


/**
 * 负责管理备忘录Memoto
 */
public class CareTaker {
    Memoto memoto;

    public Memoto getMemoto() {
        return memoto;
    }

    public void setMemoto(Memoto memoto) {
        this.memoto = memoto;
    }
}


/**
 * 使用者
 */
public class Client {
    public static void main(String[] args){
        //构建游戏对象
        CallOfDuty callOfDuty = new CallOfDuty();
        //玩游戏
        callOfDuty.play();
        //游戏存档
        CareTaker careTaker = new CareTaker();
        careTaker.setMemoto(callOfDuty.createMemoto());
        //退出游戏
        callOfDuty.quit();
        //回复游戏
        CallOfDuty callOfDuty1 = new CallOfDuty();
        callOfDuty1.restore(careTaker.getMemoto());
    }
}

运行结果

玩游戏:第1关
进度升级
到达:第2关
==============
退出游戏前的属性:CallOfDuty{mCheckPoint=2, mLifeValue=-9, mWeapon='沙漠之鹰'}
退出游戏
==============
恢复后的游戏属性:CallOfDuty{mCheckPoint=2, mLifeValue=-9, mWeapon='沙漠之鹰'}

功能

在不破坏封装性的前提下,捕获一个对象的内部状态,以便在以后的某个时刻,可以将该对象恢复到备忘录所保存的状态,这也是备忘录模式的目的。

优点

缺点

使用场景

上一篇 下一篇

猜你喜欢

热点阅读