Fork me on GitHub

java设计模式之备忘录模式

备忘录模式

  备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。一听到备忘录这个字的时候想起了小小时打的游戏,每次遇到大boss的时候都会保存一下进度,打过了就不需要恢复记录,打不过肯定就复原到刚刚保存的记录咯,重新打一遍BOSS,打死为止。哈哈,这就是备忘录模式,虽然很多模式都只是学到基础,但是发现越来越接近生活了。

涉及角色:
  Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。
  Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
  Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。

备忘录模式UML图

 

备忘录模式代码

package com.roc.meomory;
/**
 * 游戏角色
 * @author liaowp
 *
 */
public class GameRole {
    private int vit;
    private int atk;

    public void init(){
        vit=100;
        atk=100;
    }
    
    public void show(){
        System.out.println("体力:"+vit);
        System.out.println("攻击力:"+atk);
    }
    
    public void fightBoss(){
        this.vit=0;
        this.atk=0;
    }
    
    public RoleStateMemento saveMemento(){
        return (new RoleStateMemento(vit, atk));
    }
    
    public void recove(RoleStateMemento roleStateMemento){
        this.vit=roleStateMemento.getVit();
        this.atk=roleStateMemento.getAtk();
    }
}
package com.roc.meomory;
/**
 * 游戏角色管理类
 * @author liaowp
 *
 */
public class RoleStateMange {
    
    private RoleStateMemento memento;

    public RoleStateMemento getMemento() {
        return memento;
    }

    public void setMemento(RoleStateMemento memento) {
        this.memento = memento;
    }
    
}
package com.roc.meomory;
/**
 * 存储类
 * @author liaowp
 *
 */
public class RoleStateMemento {
        
    private int vit;
    private int atk;
    
    public RoleStateMemento(int vit, int atk){
        this.vit=vit;
        this.atk=atk;
    }

    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;
    }
}
package com.roc.meomory;
/**
 * 备忘录模式
 * @author liaowp
 *
 */
public class Client {
    public static void main(String[] args) {
        GameRole liaowp=new GameRole();
        liaowp.init();
        liaowp.show();
        RoleStateMange adminMange=new RoleStateMange();
        adminMange.setMemento(liaowp.saveMemento());//保存
        liaowp.fightBoss();
        liaowp.show();
        liaowp.recove(adminMange.getMemento());
        liaowp.show();
        
    }
}

备忘录模式适用场景

  适合功能比较复杂的,但需要维护或记录属性历史的功能。

 

posted @ 2016-08-21 13:20  鹏&鹏  阅读(6435)  评论(1编辑  收藏  举报