设计模式行为型备忘录模式

Posted lisin-lee-cooper

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式行为型备忘录模式相关的知识,希望对你有一定的参考价值。

一.概述

1.1 概述
又叫快照模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态

1.2 结构
发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

二.场景

游戏中的某个场景,一游戏角色有生命力、攻击力、防御力等数据,在打Boss前和后一定会不一样的,我们允许玩家如果感觉与Boss决斗的效果不理想可以让游戏恢复到决斗之前的状态.

三.类图及实现

public interface Memento 

public class GameRole 
    private int vit;
    private int atk;
    private int def;

    public void initState() 
        this.vit = 100;
        this.atk = 100;
        this.def = 100;
    

    public void fight() 
        this.vit = 0;
        this.atk = 0;
        this.def = 0;
    

    public Memento saveState() 
        return new RoleStateMemento(vit, atk, def);
    

    public void recoverState(Memento memento) 
        RoleStateMemento roleStateMemento = (RoleStateMemento) memento;
        this.vit = roleStateMemento.getVit();
        this.atk = roleStateMemento.getAtk();
        this.def = roleStateMemento.getDef();
    

    public void stateDisplay() 
        System.out.println("角色生命力:" + vit);
        System.out.println("角色攻击力:" + atk);
        System.out.println("角色防御力:" + def);
    

    public int getVit() 
        return vit;
    

    public void setVit(int vit) 
        this.vit = vit;
    

    public int getAtk() 
        return atk;
    

    public void setAtk(int atk) 
        this.atk = atk;
    

    public int getDef() 
        return def;
    

    public void setDef(int def) 
        this.def = def;
    

    private class RoleStateMemento implements Memento 
        private int vit;
        private int atk;
        private int def;

        public RoleStateMemento(int vit, int atk, int def) 
            this.vit = vit;
            this.atk = atk;
            this.def = def;
        

        public int getVit() 
            return vit;
        

        public void setVit(int vit) 
            this.vit = vit;
        

        public int getAtk() 
            return atk;
        

        public void setAtk(int atk) 
            this.atk = atk;
        

        public int getDef() 
            return def;
        

        public void setDef(int def) 
            this.def = def;
        

    

public class RoleStateCaretaker 

    private Memento memento;

    public Memento getMemento() 
        return memento;
    

    public void setMemento(Memento memento) 
        this.memento = memento;
    


public class MementoMain 
    public static void main(String[] args) 
        System.out.println("------------大战Boss前------------");
        GameRole gameRole = new GameRole();
        gameRole.initState();
        gameRole.stateDisplay();
        RoleStateCaretaker roleStateCaretaker = new RoleStateCaretaker();
        roleStateCaretaker.setMemento(gameRole.saveState());
        System.out.println("------------大战Boss后------------");
        gameRole.fight();
        gameRole.stateDisplay();
        System.out.println("------------恢复之前状态------------");
        gameRole.recoverState(roleStateCaretaker.getMemento());
        gameRole.stateDisplay();
    


以上是关于设计模式行为型备忘录模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 行为型模式 实例 -- 备忘录模式实例:游戏备忘录

手撸golang 行为型设计模式 备忘录模式

设计模式(31)-----行为型模式-----备忘录设计模式

4 行为型模式之- 备忘录模式

22行为型模式之备忘录模式

Python 设计模式 — 行为型模式 — 备忘录模式