java 设计模式之备忘录模式(十八)

撑不住的时候,可以对自己说声“我好累”,但永远不要在心里承认说“我不行”。不要在最该奋斗的年纪选择了安逸。没什么好说的,一无所有就是奋斗的理由,我们试着长大,一路跌跌撞撞,然后遍体鳞伤,总有一天,你会站在最亮的地方,活成自己曾经渴望的模样。

设计模式学习,近期我会把23种设计模式都写成博客,敬请期待~
—2021/1/25

定义

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

百度百科

角色分析

UML类图(1.1):
在这里插入图片描述

  • Originator(发起人) : 负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,
  • Memento(备忘录): 用来保存当前状态
  • Caretaker(备忘录管理者):负责管理所有存储的状态

使用场景

假设我们现在在进行打BOSS游戏,默认生命值为100

每攻击BOSS一次,生命值就会降低

等BOSS死亡后,恢复到生命值为100这里就使用到了备忘录模式

记录每一次的生命值,可以随意切换状态!

代码实现(经典案例一)

Originator需要保存的状态:

public class Originator {

    String info;

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }


    /**
     *  保存状态
     * @return 当前状态用一个类来保存
     */
    public Memento saveState(){
        return new Memento(info);
    }

    /**
     *  恢复状态
     * @return 当前状态
     */
    public void RecoveryStatus(Memento memento){
        info = memento.info;
    }

}

方法分析:

  • saveState() 用来创建Memento()来保存当前状态
  • RecoveryStatus() 因为Memento方法参数和当前类中的参数一样,所以恢复状态的时候通过Memento状态来恢复当前即可

Memento(备忘录)用来保存状态:

public class Memento {
    public String info;

    public Memento(String info) {
        this.info = info;
    }
}

Caretaker备忘录管理类:

public class Caretaker {
    /**
     * 以List的方式保存状态
     */
    ArrayList<Memento> list = new ArrayList<>();

    //添加状态
    public void add(Memento memento){
        list.add(memento);
    }

    //获取状态
    public Memento getMemento(int index){
        return list.get(index);
    }
}

测试代码(客户端):

	    //备忘录管理器
        Caretaker caretaker = new Caretaker();

        //需要保存状态
        Originator originator = new Originator();

        originator.setInfo("100");

        //保存状态 并添加到备忘录管理器中
        caretaker.add(originator.saveState());
        Log.i("备忘录模式", "当前状态 :" + originator.getInfo());


        originator.setInfo("80");
        //保存状态 并添加到备忘录管理器中
        caretaker.add(originator.saveState());
        Log.i("备忘录模式", "当前状态 :" + originator.getInfo());


        originator.setInfo("30");
        //保存状态 并添加到备忘录管理器中
        caretaker.add(originator.saveState());
        Log.i("备忘录模式", "当前状态 :" + originator.getInfo());

        //恢复当前状态
        originator.RecoveryStatus(caretaker.getMemento(1));
        Log.i("备忘录模式", "当前状态 :+" + originator.getInfo());

在使用时,只需备忘录管理类(Caretaker)和需要保存状态类(Originator)交互即可

Log图(2.1):
在这里插入图片描述
优点:

  • 会保存所有的状态,可以随意切换状态

缺点:

  • 因为保存了所有的状态,所以会创建很多类,不利于维护
  • 如果创建状态很多的情况下,很不好管理,会导致分不清状态是内个.

代码实现(经典案例二)

只保存一次状态

GameRole(需要保存状态的类):

public class GameRole {
    //攻击力
    private int aggressivity;

    //防御力
    private int defensive_power;

    //保存当前状态
    public Memento2 saveState(){
        return new  Memento2(aggressivity,defensive_power);
    }

    //恢复当前状态
    public void recoveryState(Memento2 memento2){
        this.aggressivity = memento2.getAggressivity();
        this.defensive_power = memento2.getDefensive_power();
    }

	set... get...
}

Memento2(备忘录):

public class Memento2 {
    //攻击力
    private int aggressivity;

    //防御力
    private int defensive_power;

    public Memento2(int aggressivity, int defensive_power) {
        this.aggressivity = aggressivity;
        this.defensive_power = defensive_power;
    }
	set... get...
}

Caretaker2(备忘录管理类):

public class Caretaker2 {

    //保存Memento2状态
    private Memento2 memento2;


    public Memento2 getMemento2() {
        return memento2;
    }

    public void setMemento2(Memento2 memento2) {
        this.memento2 = memento2;
    }
}

测试代码(客户端):

		GameRole gameRole = new GameRole();
        //默认攻击力
        gameRole.setAggressivity(100);
        //默认防御力
        gameRole.setDefensive_power(100);

        Log.i("备忘录模式2",
                "当前状态 :攻击力: " + gameRole.getAggressivity() +
                        " 防御力:" + gameRole.getDefensive_power());

        //备忘录
        Caretaker2 caretaker2 = new Caretaker2();

        //保存状态
        caretaker2.setMemento2(gameRole.saveState());

        //大战后攻击力和防御力降低到50
        gameRole.setAggressivity(50);
        gameRole.setDefensive_power(50);

        Log.i("备忘录模式2",
                "当前状态 :攻击力: " + gameRole.getAggressivity() +
                        " 防御力:" + gameRole.getDefensive_power());


        //恢复状态
        gameRole.recoveryState(caretaker2.getMemento2());


        Log.i("备忘录模式2",
                "当前状态 :攻击力: " + gameRole.getAggressivity() +
                        " 防御力:" + gameRole.getDefensive_power());

备忘录模式还是简单的,希望本篇能够帮助到您~

完整代码

去设计模式主页

原创不易,您的点赞就是对我最大的支持~

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页