备忘录模式是一种对象行为模式,它在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。备忘录模式能够记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。
备忘录模式(Memento Pattern)是一种行为型设计模式,它的主要目的是在不破坏封装的前提下,捕获和恢复对象的状态,这种模式通过创建一个备忘录类来保存对象的内部状态,以便在之后可以将其恢复到之前的状态,这种模式非常适用于那些需要保存对象历史状态的应用场景,例如撤销操作、数据版本控制等。
备忘录模式的主要角色有以下几个:
1、主题(Subject):定义了增加、删除备忘录以及通知观察者的方法。
2、备忘录(Memento):负责保存被管理对象的内部状态。
3、观察者(Observer):定义了更新被管理对象状态的方法。
下面我们通过一个简单的例子来说明如何使用备忘录模式,假设我们有一个在线购物系统,用户可以添加商品到购物车,当我们需要恢复购物车中某个商品的状态时,可以使用备忘录模式来实现。
我们定义一个Product
类来表示商品:
public class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } // 省略getter和setter方法 }
我们定义一个ShoppingCart
类来表示购物车:
import java.util.ArrayList; import java.util.List; public class ShoppingCart implements MementoSubject { private List<Product> products; private Memento memento; public ShoppingCart() { products = new ArrayList<>(); } public void addProduct(Product product) { // 将当前购物车状态保存到备忘录中 memento = createMemento(); products.add(product); } public void removeProduct(int index) { // 从购物车中移除指定商品,并将当前购物车状态保存到备忘录中 if (index >= 0 && index < products.size()) { products.remove(index); memento = createMemento(); } } public List<Product> getProducts() { return products; } @Override public Memento getCurrentState() { return memento; } }
我们定义一个Memento
接口来表示备忘录:
public interface Memento {}
我们定义一个具体的备忘录类MementoImpl
,用于保存购物车的内部状态:
public class MementoImpl implements Memento { private List<Product> products; public MementoImpl(List<Product> products) { this.products = products; } public List<Product> getProducts() { return products; } }
我们需要实现MementoSubject
接口,以便在添加或删除商品时通知观察者:
public interface MementoSubject {}