软件编程
位置:首页>> 软件编程>> java编程>> Java设计模式之备忘录模式实现对象状态的保存和恢复

Java设计模式之备忘录模式实现对象状态的保存和恢复

作者:.番茄炒蛋  发布时间:2023-08-28 15:22:27 

标签:Java,设计模式,备忘录模式

介绍

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获并保存一个对象的内部状态,并在之后可以恢复该对象到先前的状态.该模式的核心是备忘录(Memento)类,它储存了一个对象的内部状态.

在Java中,备忘录模式可以通过定义一个备忘录类来实现.备忘录类通常包含一个或多个私有字段来储存要保存的对象的内部状态.备忘录类还可以提供公共方法来获取和设置这些字段.原始对象可以使用备忘录类创建备忘录,并将其保存到历史记录中.在需要恢复对象的状态时,原始对象可以从历史记录中获取备忘录,并使用备忘录来恢复其状态.

在备忘录模式中,一般会涉及到以下三个角色:

  • Originator(发起人):它是要被保存状态的对象.它提供了创建备忘录和恢复备忘录的接口,允许其他对象获取其内部状态.

  • Memento(备忘录):它用于储存Originator内部状态得对象.备忘录可以根据Originator得需求来保存其内部状态,并且可以防止Originator以外得其他对象访问该状态.

  • Caretaker(管理者):它负责保存备忘录,并在需要时将其提供给Originator进行恢复,Caretaker可以储存多个备忘录,以及支持多次撤销操作.

在Java中实现备忘录模式时,一般会涉及到以上三个角色.其中Originator和Memento是必需的,Caretaker可以根据实际需要来选择是否实现.

实现

假设有一个游戏角色类Role,它有三个属性:attack(攻击力),defense(防御力)和hp(生命值).现在我们要实现一个备忘录模式,可以保存角色的状态,并在需要时恢复角色的状态.

备忘录类

@Data
public class Memento {
   /**
    * 攻击力
    */
   private int attack;
   /**
    * 防御力
    */
   private int defense;
   /**
    * 生命值
    */
   private int hp;
   public Memento(int attack, int defense, int hp) {
       this.attack = attack;
       this.defense = defense;
       this.hp = hp;
   }
}

发起人类

@Data
public class Role {
   /**
    * 攻击力
    */
   private int attack;
   /**
    * 防御力
    */
   private int defense;
   /**
    * 生命值
    */
   private int hp;
   public Role(int attack, int defense, int hp) {
       this.attack = attack;
       this.defense = defense;
       this.hp = hp;
   }
   /**
    * 将当前对象储存值Memento中
    * @return
    */
   public Memento save(){
       return new Memento(attack,defense,hp);
   }
   /**
    * 从memento中获取状态;并恢复到当前状态
    * @param memento
    */
   public void restore(Memento memento){
       attack = memento.getAttack();
       defense = memento.getDefense();
       hp = memento.getHp();
   }
}

管理者类

public class Caretaker {
   private List<Memento> mementos = new ArrayList<>();
   public void addMemento(Memento m){
       mementos.add(m);
   }
   public Memento getMemento(int index){
       return mementos.get(index);
   }
}

测试

public class Demo {
   public static void main(String[] args) {
       Role role = new Role(100,50,20);
       Caretaker caretaker = new Caretaker();
       Memento memento = role.save();
       caretaker.addMemento(memento);
       // 攻击力+10
       role.setAttack(role.getAttack()+10);
       System.out.println(JSON.toJSONString(role));
       // 恢复
       role.restore(caretaker.getMemento(0));
       System.out.println(JSON.toJSONString(role));
   }
}

Java设计模式之备忘录模式实现对象状态的保存和恢复

这是一个完整的备忘录模式的例子.在这个例子中,我们创建一个备忘录类Memento,它保存了角色的攻击力,防御力和生命值.我们还创建了一个角色类Role,它可以保存和恢复角色的状态.最后.我们创建了一个Caretaker类,它用于保存Memento对象.通过这些类的结合使用,我们实现了备忘录模式.

来源:https://blog.csdn.net/qq_43135259/article/details/129668905

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com