尚硅谷设计模式学习(20)---[备忘录模式(Memento Pattern)]

Posted 小智RE0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尚硅谷设计模式学习(20)---[备忘录模式(Memento Pattern)]相关的知识,希望对你有一定的参考价值。

尚硅谷传送门==>B站尚硅谷Java设计模式

❤❤❤感谢尚硅谷❤❤❤

最近开始计划学习一下设计模式了,加油!!!



案例引入:
例如游戏中的玩家状态恢复:

游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当打斗Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态.

按照传统思路解决的话,创建一个对象,就得对应地创建它相应状态的对象,要是备份的数据量对象较多,过于复杂.


备忘录模式

不破坏封装性,捕获一个对象的内部状态,并在该对象之外保存这个状态.
通俗易懂地说就是个记事本,把之前数据先存入,用的时候可以看到之前的信息.

基本原理

Caretaker 管理者: 存储备忘录对象 时,可以存单个,要是多的话就可以存集合
实现了信息的封装,使得用户不需要关心状态的保存细节

备忘录类;Memento

/**
 * @author by CSDN@小智RE0
 * @date 2021-10-05 11:12
 */

//备忘录对象所在类;
public class Memento {

    //备忘录-->状态对象;
    private String mementoState;

    //初始化时,将原始状态信息存入;
    public Memento(String myState) {
        this.mementoState = myState;
    }

    //获取状态信息;
    public String getMementoState() {
        return mementoState;
    }
}

原始类Originator

/**
 * @author by CSDN@小智RE0
 * @date 2021-10-05 11:12
 */

//原始对象的所在类;
public class Originator {
    //原始-->状态信息;
    private  String myState;

    public String getMyState() {
        return myState;
    }

    public void setMyState(String myState) {
        this.myState = myState;
    }

    //保存状态到备忘录;
    public Memento holdState(){
        return new Memento(myState);
    }

    //由备忘录恢复;
    public void getMyStateFromMemento(Memento memento){
        myState = memento.getMementoState();
    }
}

存放备忘录的类;Caretaker

/**
 * @author by CSDN@小智RE0
 * @date 2021-10-05 11:14
 */

//存储聚合备忘录对象;
public class Caretaker {
    private List<Memento> mementoList = new ArrayList<Memento>();

    //添加备忘录对象;进行存储;
    public void addMementos(Memento memento){
        mementoList.add(memento);
    }

    //获取到指定位置的备忘录对象;
    public Memento get(int i){
        return mementoList.get(i);
    }
}

模拟客户端

//模拟客户端
public class Client {
    public static void main(String[] args) {
        //创建原始类;
        Originator originator = new Originator();

        //存放备忘录对象的类;
        Caretaker caretaker = new Caretaker();

        originator.setMyState("初始生命状态 -->1000");
        caretaker.addMementos(originator.holdState());
        originator.setMyState("经过5分钟状态 -->800");
        caretaker.addMementos(originator.holdState());
        originator.setMyState("最终状态  -->200");
        caretaker.addMementos(originator.holdState());

        System.out.println("现在的状态为->"+originator.getMyState());
        System.out.println("--恢复初始状态--");
        originator.getMyStateFromMemento(caretaker.get(0));
        System.out.println(originator.getMyState());
    }
}

输出

现在的状态为->最终状态  -->200
--恢复初始状态--
初始生命状态 -->1000

接着回到开始的案例;关于游戏角色的状态问题;

先画图

备忘录类MementoGame

/**
 * @author by CSDN@小智RE0
 * @date 2021-10-05 12:32
 */

//备忘录类;存储备份的状态;
public class MementoGame {
    //攻击力;
    private int attackForce;
    //防御力;
    private int phylacticPower;

    //初始化就存入了原始的状态进行备份;
    public MementoGame(int attackForce, int phylacticPower) {
        this.attackForce = attackForce;
        this.phylacticPower = phylacticPower;
    }

    public int getAttackForce() {
        return attackForce;
    }

    public void setAttackForce(int attackForce) {
        this.attackForce = attackForce;
    }

    public int getPhylacticPower() {
        return phylacticPower;
    }

    public void setPhylacticPower(int phylacticPower) {
        this.phylacticPower = phylacticPower;
    }
}

角色初始状态类;OriginatorGame

/**
 * @author by CSDN@小智RE0
 * @date 2021-10-05 12:36
 */

//原始类;存储的是原始状态;
public class OriginatorGame {
    //攻击力;
    private int attackForce;
    //防御力;
    private int phylacticPower;

    //初始化;


    public OriginatorGame(int attackForce, int phylacticPower) {
        this.attackForce = attackForce;
        this.phylacticPower = phylacticPower;
    }

    //创建备份,存入原始状态;
    public MementoGame createMemento(){
        return new MementoGame(attackForce,phylacticPower);
    }

    //获取备份的数据; 攻击力,防御力;
    public void getStateFromMementoGame(MementoGame mementoGame){
       this.attackForce= mementoGame.getAttackForce();
       this.phylacticPower = mementoGame.getPhylacticPower();
    }

    //显示当前的角色的状态(攻击力,防御力);
    public void show(){
        System.out.println("当前攻击力=>"+this.attackForce+" &当前防御力=>"+this.phylacticPower);
    }

    public int getAttackForce() {
        return attackForce;
    }

    public void setAttackForce(int attackForce) {
        this.attackForce = attackForce;
    }

    public int getPhylacticPower() {
        return phylacticPower;
    }

    public void setPhylacticPower(int phylacticPower) {
        this.phylacticPower = phylacticPower;
    }
}

存储备忘录对象

/**
 * @author by CSDN@小智RE0
 * @date 2021-10-05 12:36
 */

//管理者,保存备忘录对象;
public class Caretaker {
    //存入备忘录对象;
    private MementoGame mementoGame;

    public MementoGame getMementoGame() {
        return mementoGame;
    }

    public void setMementoGame(MementoGame mementoGame) {
        this.mementoGame = mementoGame;
    }
}

模拟客户端

/**
 * @author by CSDN@小智RE0
 * @date 2021-10-05 12:37
 */
//模拟客户端;
public class Client {
    public static void main(String[] args) {

        //创建原始游戏角色对象; 设置攻击力,防御力;
        OriginatorGame originatorGame = new OriginatorGame(1000,1000);

        System.out.println("--------初始的状态为----------");
        originatorGame.show();

        //备忘录 初始状态存入;
        Caretaker caretaker = new Caretaker();
        caretaker.setMementoGame(originatorGame.createMemento());

        System.out.println("10分钟后,防御力下降---------");
        originatorGame.setPhylacticPower(600);
        System.out.println("-------状态");
        originatorGame.show();

        System.out.println("20分钟后,战斗力提升---------");
        originatorGame.setAttackForce(2000);
        System.out.println("--------状态");
        originatorGame.show();

        System.out.println("结束,恢复至初始状态----------");
        originatorGame.getStateFromMementoGame(caretaker.getMementoGame());
        System.out.println("-----恢复后的状态");
        originatorGame.show();
    }
}

执行

--------初始的状态为----------
当前攻击力=>1000 &当前防御力=>1000
10分钟后,防御力下降---------
-------状态
当前攻击力=>1000 &当前防御力=>600
20分钟后,战斗力提升---------
--------状态
当前攻击力=>2000 &当前防御力=>600
结束,恢复至初始状态----------
-----恢复后的状态
当前攻击力=>1000 &当前防御力=>1000

以上是关于尚硅谷设计模式学习(20)---[备忘录模式(Memento Pattern)]的主要内容,如果未能解决你的问题,请参考以下文章

尚硅谷设计模式学习---[装饰者模式]

尚硅谷设计模式学习---[单例模式]

尚硅谷设计模式学习---[桥接模式(Bridge)]

尚硅谷设计模式学习(23)---[策略模式(strategy pattern)]

尚硅谷设计模式学习---[简单工厂模式,工厂方法模式,抽象工厂模式]

尚硅谷设计模式学习(17)---[迭代器模式(Iterator Pattern)]