大话设计模式学习笔记(18)——备忘录模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1052196521/article/details/79699011

源码git地址 https://github.com/dlovetco/designMode

问题提出

玩游戏的时候在打boss之前都会保存一下,如果被boss打死了还可以读档重新来过。试着用代码实现这种保存的机制。

代码写到现在,相信小伙伴们都应该知道要注意一些什么事情。
比如:
- 降低类与类之间的耦合性,尽量面向接口编程
- 尽可能的降低类的可见性。客户端能接触到的类越少越好(包括类的实现细节),这就要求我们在设计的时候尽可能的考虑封装性。

备忘录模式

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

package memento;

import java.util.HashMap;
import java.util.Map;

public class MementoMode {
    public static void main(String[] args) {
        Status status = new Status(100, 100, 100);
        SaveManager saveManager = new SaveManager();
        saveManager.createSave(status.save());
        System.out.println(status);
        status.attack = 0;
        status.defend = 0;
        status.hp = 0;
        System.out.println(status);
        status.load(saveManager.getSave(1));
        System.out.println(status);
    }
}

/**
 * 状态
 */
class Status {
    int attack;

    int defend;

    int hp;

    public Status(int attack, int defend, int hp) {
        this.attack = attack;
        this.defend = defend;
        this.hp = hp;
    }

    /**
     * 保存
     */
    public Save save() {
        return new Save(attack, defend, hp);
    }

    /**
     * 载入存档
     */
    public void load(Save save) {
        this.attack = save.attack;
        this.defend = save.defend;
        this.hp = save.hp;
    }

    @Override
    public String toString() {
        return "Status{" +
                "attack=" + attack +
                ", defend=" + defend +
                ", hp=" + hp +
                '}';
    }
}

class SaveManager {
    Map<Integer, Save> saveMap = new HashMap<>();

    public void createSave(Save save) {
        saveMap.put(saveMap.size() + 1, save);
    }

    public Save getSave(int num) {
        return saveMap.get(num);
    }

}

/**
 * 存档
 */
class Save {
    int attack;

    int defend;

    int hp;

    public Save(int attack, int defend, int hp) {
        this.attack = attack;
        this.defend = defend;
        this.hp = hp;
    }
}

输出:
Status{attack=100, defend=100, hp=100}
Status{attack=0, defend=0, hp=0}
Status{attack=100, defend=100, hp=100}

Status是角色的实时状态,Save是角色在某个瞬间保存下来的状态然后把这个save对象移交给SaveManager管理。
注意:备忘录模式其实是使用额外的空间保存目标对象的“快照”。所以如果目标对象过于庞大,那么在使用备忘录模式之前 须“三思而后行

plantuml

@startuml
class Save{
}
Save <.. Status
class Status{
save()
load()
}
Save <..* SaveManager
class SaveManager{
Map<Integer, Save> saveMap
createSave()
getSave()
}
@enduml

这里写图片描述

猜你喜欢

转载自blog.csdn.net/q1052196521/article/details/79699011
今日推荐