欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java设计模式--备忘录模式

程序员文章站 2022-06-09 13:47:49
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象外保存这个状态,这样以后可将此对象恢复成原来的状态。 就拿单机游戏举例,玩游戏打boss前我们通常都会存档,避免打boss时失误死亡好恢复存档重新开始,我们首先看下面的例子。 测试结果: health:100,mana:100he ......

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

  就拿单机游戏举例,玩游戏打boss前我们通常都会存档,避免打boss时失误死亡好恢复存档重新开始,我们首先看下面的例子。

//游戏鬼泣的主角dante类
public class dante {
    //生命值
    private int health;
    //魔法值
    private int mana;

    public int gethealth() {
        return health;
    }

    public void sethealth(int health) {
        this.health = health;
    }

    public int getmana() {
        return mana;
    }

    public void setmana(int mana) {
        this.mana = mana;
    }

    //角色的初始状态
    public void getinitstate(){
        this.health = 100;
        this.mana = 100;
    }

    public void deathstate(){
        this.health = 0;
        this.mana = 0;
    }

    public void showstate(){
        system.out.println("health:"+health+",mana:"+mana);
    }
}

 

public class test  {
    public static void main(string[] args) {
        //初始化状态
        dante dante = new dante();
        dante.getinitstate();
        dante.showstate();

        //存档
        dante dantebak = new dante();
        dantebak.sethealth(dante.gethealth());
        dantebak.setmana(dante.getmana());

        //角色死亡时的状态
        dante.deathstate();
        dante.showstate();

        //恢复存档
        dante.sethealth(dantebak.gethealth());
        dante.setmana(dantebak.getmana());
        dante.showstate();
    }
}

测试结果:

health:100,mana:100
health:0,mana:0
health:100,mana:100

  上面的方法虽然实现了存档,可是实现的并不优美,在测试方法中暴露了太多存档的实现细节,并且如果以后需要保存新的角色属性,那我们就需要修改客户端,所以我们就用到了备忘录模式,把角色属性的保存封装在单独的类中,体现“职责分离”。示例如下。

  首先定义了一个“存储卡”类,用于保存角色数据

public class memorycard {

    private int health;

    private int mana;

    public int gethealth() {
        return health;
    }

    public void sethealth(int health) {
        this.health = health;
    }

    public int getmana() {
        return mana;
    }

    public void setmana(int mana) {
        this.mana = mana;
    }

    public memorycard(int health,int mana){
        this.health =health;
        this.mana = mana;
    }
}

 

  角色状态管理者,用于保存存储卡,并且不能对存储卡的内容进行操作

public class memorycardcreataker {

    private memorycard memorycard;

    public memorycard getmemorycard() {
        return memorycard;
    }

    public void setmemorycard(memorycard memorycard) {
        this.memorycard = memorycard;
    }
}

 

  游戏角色类

//游戏鬼泣的主角dante类
public class dante {
    //生命值
    private int health;
    //魔法值
    private int mana;

    public int gethealth() {
        return health;
    }

    public void sethealth(int health) {
        this.health = health;
    }

    public int getmana() {
        return mana;
    }

    public void setmana(int mana) {
        this.mana = mana;
    }

    //角色的初始状态
    public void getinitstate(){
        this.health = 100;
        this.mana = 100;
    }

    public void deathstate(){
        this.health = 0;
        this.mana = 0;
    }

    public void showstate(){
        system.out.println("health:"+health+",mana:"+mana);
    }

    //将角色状态保存在存储卡中
    public memorycard savestate(){
        return new memorycard(health,mana);
    }

    //回档
    public void recoverystate(memorycard memorycard){
        this.health = memorycard.gethealth();
        this.mana = memorycard.getmana();
    }
}

  测试方法

public class test  {
    public static void main(string[] args) {
        //初始化状态
        dante dante = new dante();
        dante.getinitstate();
        dante.showstate();

        //存档
        memorycardcreataker memorycardcreataker = new memorycardcreataker();
        memorycardcreataker.setmemorycard(dante.savestate());

        //角色死亡时的状态
        dante.deathstate();
        dante.showstate();

        //恢复存档
        dante.recoverystate(memorycardcreataker.getmemorycard());
        dante.showstate();
    }
}

测试结果:

health:100,mana:100
health:0,mana:0
health:100,mana:100

总结    优点:使用备忘录模式很好地将被保存的对象和保存的状态分隔开来,并且该对象状态备份和恢复不需要自己处理,而是转交给客户端处理,并且如何保存的细节封装到了存储卡中,不再影响客户端。

   缺点:由于备忘录对象会消耗内存,如果需要保存的状态占用的内存较大时,资源的消耗也就越大。