设计模式(十二):备忘录模式

来源:互联网 发布:网络推广信息方案 编辑:程序博客网 时间:2024/06/04 19:19

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


(1):Originator:负责实例化一个备忘录Memento类,记录当前时刻它的内部状态,作为备份。

(2):Memento:备忘录类,Originator的状态备份

(3)Caretaker:管理者类,管理备忘录类,通过caretaker对备忘录设置和访问


例子:

玩仙剑的时候,每次大战boss之前,一般都会有一个存档的地方保存游戏的当前进度,如果大战boss失败,可以读取存档重新来过,存档就相当于备忘录。

1、Originator类,游戏角色

(1)属性:包含生命力,防御力、攻击力三个属性,初始化值都为100

(2)方法:saveState()方法,保存当前的状态,并返回一个备忘录类,相当于游戏中的存档 

                    recoverState(Memento),恢复状态方法,需要传入一个备忘录类,从备忘录中恢复状态

                    show()方法,显示当前状态

                    attack()方法       

/** * Originator类 */public class GameRole {    private int vitality;//生命力    private int attack;//攻击力    private int defense;//防御力    //初始化    public GameRole() {        this.vitality=100;        this.attack=100;        this.defense=100;    }    public void show(){        System.out.println("生命力:"+vitality);        System.out.println("攻击力:"+attack);        System.out.println("防御力:"+defense);    }    /**     * 保存状态     * @return     */    public RoleStateMemento saveState(){        //返回一个备忘录类,用来保存当前状态        return new RoleStateMemento(this.vitality,this.attack,this.defense);    }    /**     * 恢复状态     * @param roleStateMemento     */    public void recoveryState(RoleStateMemento roleStateMemento){        this.vitality=roleStateMemento.getVitality();        this.defense=roleStateMemento.getDefense();        this.attack=roleStateMemento.getAttack();    }    /**     * 战斗     */    public void fight(){        this.vitality=0;        this.attack=0;        this.defense=0;    }    public int getVitality() {        return vitality;    }    public void setVitality(int vitality) {        this.vitality = vitality;    }    public int getAttack() {        return attack;    }    public void setAttack(int attack) {        this.attack = attack;    }    public int getDefense() {        return defense;    }    public void setDefense(int defense) {        this.defense = defense;    }}

2、备忘录类,用来保存Originator的状态

/** * Memento备忘录类 */public class RoleStateMemento {    private int vitality;//生命力    private int attack;//攻击力    private int defense;//防御力    public RoleStateMemento(int vitality, int attack, int defense) {        this.vitality = vitality;        this.attack = attack;        this.defense = defense;    }    public int getVitality() {        return vitality;    }    public void setVitality(int vitality) {        this.vitality = vitality;    }    public int getAttack() {        return attack;    }    public void setAttack(int attack) {        this.attack = attack;    }    public int getDefense() {        return defense;    }    public void setDefense(int defense) {        this.defense = defense;    }}

3、管理者类

包含一个对备忘录类的引用,负责设置和访问备忘录类

/** * Caretaker管理者类 */public class RoleStateCaretaker {    private RoleStateMemento memento;    public RoleStateMemento getMemento() {        return memento;    }    public void setMemento(RoleStateMemento memento) {        this.memento = memento;    }}


4、客户端

public class Test {    public static void main(String[] args) {        //创建游戏角色李逍遥        GameRole lixiaoyao=new GameRole();        System.out.println("战斗前:");        lixiaoyao.show();        //保存进度,创建一个管理者        RoleStateCaretaker roleStateCaretaker=new RoleStateCaretaker();        roleStateCaretaker.setMemento(lixiaoyao.saveState());//由管理者管理备忘录类        //战斗        lixiaoyao.fight();        System.out.println("战斗后:");        lixiaoyao.show();        //恢复进度        lixiaoyao.recoveryState(roleStateCaretaker.getMemento());        System.out.println("恢复:");        lixiaoyao.show();    }}

输出:

战斗前:生命力:100攻击力:100防御力:100战斗后:生命力:0攻击力:0防御力:0恢复:生命力:100攻击力:100防御力:100

来自:大话设计模式