• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
思想人生从关注生活开始
博客园    首页    新随笔    联系   管理    订阅  订阅

备忘录设计Memento Pattern-23种常用设计模式快速入门教程

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());
}
}
 
posted @ 2023-03-07 16:57  JackYang  阅读(89)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3