行为型模式备忘录模式(Memento)

备忘录模式(Memento Pattern)属于行为型模式的一种,它通过在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,从而在以后可以将对象恢复到保存的状态。备忘录模式提供了一种在不暴露对象细节的情况下保存和恢复对象状态的方法。

### 模式结构

备忘录模式涉及三个主要角色:

- 发起人(Originator):负责创建并定义备忘录的数据结构,可以记录和恢复自身的内部状态。

- 备忘录(Memento):用来存储发起人的内部状态,并且可以防止发起人之外的对象访问备忘录。

- 管理者(Caretaker):负责保存和恢复备忘录对象,可以对备忘录进行管理,但是不对备忘录的具体内容进行操作或检查。

模式结构图如下:

```

+-----------------+ +-----------------+

| Originator | | Memento |

+-----------------+ +-----------------+

| | | |

| - state | | - state |

| |<------->| |

| + createMemento() | + getState() |

| + restoreMemento() | |

+-----------------+ +-----------------+

|

+-----------------+

| Caretaker |

+-----------------+

| |

| - memento: Memento (可以存储多个备忘录对象)

| |

| + addMemento() (添加备忘录)

| + getMemento() (获取备忘录)

| |

+-----------------+

```

### 实现步骤

以下是使用备忘录模式的基本步骤:

1. 创建发起人类(Originator),用于创建和定义备忘录的数据结构。发起人类通常包含需要保存的内部状态,并且可以创建备忘录对象、恢复备忘录对象以及获取当前状态的方法。

2. 创建备忘录类(Memento),用于存储发起人的内部状态。通常备忘录类的属性与发起人类的属性相对应。

3. 创建管理者类(Caretaker),用于保存和恢复备忘录对象。管理者类可以保存多个备忘录对象,并提供添加备忘录和获取备忘录的方法。

4. 客户端通过创建发起人对象,并调用相关方法来创建备忘录、恢复备忘录等操作。

### 代码示例

下面通过一个简单的购物车示例来演示备忘录模式的使用。假设有一个购物车类`ShoppingCart`,具有添加商品、移除商品、获取总价等功能,我们希望能够保存购物车的状态,并在需要的时候恢复。

首先,我们创建一个备忘录类`CartMemento`,用于保存购物车的状态:

```java

public class CartMemento {

private List items;

private double total;

public CartMemento(List items, double total) {

this.items = new ArrayList<>(items);

this.total = total;

}

public List getItems() {

return new ArrayList<>(items);

}

public double getTotal() {

return total;

}

}

```

然后,创建发起人类`ShoppingCart`,用于创建和定义备忘录的数据结构,并提供创建备忘录和恢复备忘录的方法:

```java

public class ShoppingCart {

private List items;

private double total;

public ShoppingCart() {

items = new ArrayList<>();

total = 0;

}

public void addItem(String item, double price) {

items.add(item);

total += price;

}

public void removeItem(String item, double price) {

items.remove(item);

total -= price;

}

public void printCart() {

System.out.println("Items: " + items);

System.out.println("Total: $" + total);

}

public CartMemento createMemento() {

return new CartMemento(items, total);

}

public void restoreMemento(CartMemento memento) {

items = memento.getItems();

total = memento.getTotal();

printCart();

}

}

```

最后,创建管理者类`CartCaretaker`,用于保存和恢复备忘录对象:

```java

import java.util.ArrayList;

import java.util.List;

public class CartCaretaker {

private List mementos;

public CartCaretaker() {

mementos = new ArrayList<>();

}

public void addMemento(CartMemento memento) {

mementos.add(memento);

}

public CartMemento getMemento(int index) {

return mementos.get(index);

}

}

```

通过以下示例代码来演示备忘录模式的使用:

```java

public class Demo {

public static void main(String[] args) {

// 创建购物车

ShoppingCart cart = new ShoppingCart();

cart.addItem("Apple", 0.5);

cart.addItem("Orange", 0.3);

// 创建管理者

CartCaretaker caretaker = new CartCaretaker();

caretaker.addMemento(cart.createMemento()); // 保存状态

cart.addItem("Banana", 0.2);

cart.printCart(); // 输出:Items: [Apple, Orange, Banana] Total: $1.0

cart.removeItem("Orange", 0.3);

cart.printCart(); // 输出:Items: [Apple, Banana] Total: $0.7

cart.restoreMemento(caretaker.getMemento(0)); // 恢复上一个状态

}

}

```

上述示例中,我们使用备忘录模式来保存购物车的状态。在创建购物车对象后,我们向购物车添加了一些商品,然后通过创建备忘录对象并将其保存到管理者中。接下来进行了一些修改操作,最后通过恢复备忘录对象来将购物车恢复到之前的状态。通过使用备忘录模式,我们可以方便地保存和恢复购物车对象的状态。

总结来说,备忘录模式提供了一种保存和恢复对象状态的方法,它通过在不破坏封装的前提下,捕获对象的内部状态并在对象之外保存这个状态。使用备忘录模式可以提高系统的灵活性和可维护性,同时也可以减少对于原始对象的访问,保持了良好的封装性。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(63) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部