最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

备忘录设计Memento Pattern

网站源码admin2浏览0评论

备忘录设计Memento Pattern

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());

}

}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-03-07,如有侵权请联系 cloudcommunity@tencent 删除系统存储对象设计设计模式

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论