1.备忘录设计模式定义
备忘录模式是一种行为型设计模式,其主要用于保存对象状态,以便在需要时恢复其先前的状态。该模式将对象状态封装到备忘录对象中,使得该对象的状态可以在不破坏其封装性的情况下被恢复。
备忘录模式由三个主要组件组成:
- 发起人(Originator):它是要保存状态的对象。它创建备忘录并将其状态存储在其中。
- 备忘录(Memento):它存储发起人对象的状态。它只允许发起人对象访问状态。
- 管理者(Caretaker):它负责保存备忘录。它只能将备忘录传递给其他对象,不能访问备忘录的内容。
总之,备忘录模式是一种非常有用的设计模式,可以方便地实现对象状态的保存和恢复,保护对象状态的封装性,并简化原发器对象的代码。但是,在使用备忘录模式时,需要权衡其优缺点,并根据实际情况选择合适的方案。
2.备忘录设计模式优点
- 保存和恢复对象状态
- 备忘录模式将对象的状态封装在备忘录对象中,使得系统可以在需要时保存对象的状态并在需要时恢复状态。这样可以方便地实现撤销、重做等操作。
- 保护对象状态的封装性
- 备忘录模式将对象状态封装在备忘录对象中,而不是直接暴露给其他对象。这样可以确保对象状态的封装性不会被破坏。
- 简化原发器对象的代码
- 备忘录模式将状态保存和恢复的职责从原发器对象中分离出来,使得原发器对象的代码更加简洁明了。
- 可以实现状态共享
- 如果多个原发器对象需要共享同一个状态,备忘录模式可以很方便地实现状态共享,从而避免状态的重复创建和存储。
3.备忘录设计模式缺点
- 备忘录对象的创建和存储可能会导致很高的开销。
如果备忘录对象的创建和存储需要大量的时间和资源,那么备忘录模式就不是一个很好的选择。
- 备忘录模式需要在原发器对象中添加额外的代码来管理备忘录对象
这可能会使得原发器对象的代码变得更加复杂和难以维护。
- 备忘录模式可能会暴露原发器对象的实现细节
因为备忘录对象需要访问原发器对象的状态,所以备忘录模式可能会暴露原发器对象的实现细节,从而破坏其封装性。
- 备忘录模式可能会增加系统的复杂度
备忘录模式涉及到多个对象之间的交互,如果不加以控制,可能会增加系统的复杂度,并降低系统的可维护性。
4.解释器模式示例代码
传统设计模式讲解时使用的示例代码,大都采用与读者日常生活接解的业务系统没有多大关联关系。以致大部分读者无法做到学以致用,学完就忘记。本文采用使用日常生活中随处可见的优惠券业务来编写实现代码:
在电商平台中,备忘录模式可以用于保存用户购物车的状态。具体来说,用户的购物车可以被视为一个发起人对象,它的状态包括购物车中的商品数量、商品价格、商品折扣等信息。 当用户在购物车中添加或删除商品时,购物车对象会创建一个备忘录对象,并将当前状态保存在备忘录对象中。备忘录对象由管理者对象保存,以便在需要时可以将购物车状态恢复到先前的状态。 以下是一个基于Java实现的备忘录模式示例代码,该代码演示了如何使用备忘录模式保存购物车的状态。
public class ShoppingCartMemento {
private int itemCount;
private double totalPrice;
public ShoppingCartMemento(int itemCount, double totalPrice) {
this.itemCount = itemCount;
this.totalPrice = totalPrice;
}
public int getItemCount() {
return itemCount;
}
public double getTotalPrice() {
return totalPrice;
}
}
public class ShoppingCart {
private int itemCount;
private double totalPrice;
public void addItem(int count, double price) {
itemCount += count;
totalPrice += count * price;
}
public void removeItem(int count, double price) {
itemCount -= count;
totalPrice -= count * price;
}
public ShoppingCartMemento save() {
return new ShoppingCartMemento(itemCount, totalPrice);
}
public void restore(ShoppingCartMemento memento) {
itemCount = memento.getItemCount();
totalPrice = memento.getTotalPrice();
}
public String toString() {
return "Item count: " + itemCount + ", Total price: " + totalPrice;
}
}
public class ShoppingCartCaretaker {
private ShoppingCartMemento memento;
public void saveMemento(ShoppingCartMemento memento) {
this.memento = memento;
}
public ShoppingCartMemento getMemento() {
return memento;
}
}
public class Main {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
ShoppingCartCaretaker caretaker = new ShoppingCartCaretaker();
// 添加商品
cart.addItem(2, 100);
System.out.println("After adding items: " + cart.toString());
// 保存状态
ShoppingCartMemento memento = cart.save();
caretaker.saveMemento(memento);
// 删除商品 cart.removeItem(1, 100);
System.out.println("After removing items: " + cart.toString());
// 恢复状态 memento = caretaker.getMemento();
cart.restore(memento);
System.out.println("After restoring items: " + cart.toString());
}
}