用Rust实现23种设计模式之 备忘录模式

本文介绍了备忘录模式在Rust中的应用,展示了如何通过封装状态并创建Memento、Originator和Caretaker对象来实现对象状态的保存、恢复和管理,适用于需要历史状态跟踪和保护对象内部状态的场景。
摘要由CSDN通过智能技术生成

关注我,学习Rust不迷路!!

备忘录模式是一种行为型设计模式,它允许在不暴露对象内部状态的情况下捕获和恢复对象的状态。以下是备忘录模式的优点和使用场景:

优点:

  1. 封装性:备忘录模式将对象的状态保存在备忘录对象中,从而实现了对象状态的封装,使得其他对象无法直接访问。
  2. 可恢复性:备忘录模式允许在不破坏封装性的前提下,捕获和恢复对象的状态,从而提供了对象状态的可恢复性。
  3. 扩展性:备忘录模式可以灵活地添加新的备忘录对象,从而支持多个历史状态的保存和恢复。

使用场景:

  1. 当需要保存和恢复对象的历史状态,并且不希望暴露对象内部状态时,可以考虑使用备忘录模式。
  2. 当需要实现撤销和重做功能时,可以考虑使用备忘录模式。
  3. 当需要保存和恢复对象的状态,并且希望将状态保存在外部,以减少内存占用时,可以考虑使用备忘录模式。

Rust实现备忘录模式的代码示例:

下面是一个使用Rust实现备忘录模式的示例代码,带有详细的注释和说明:

// 定义备忘录对象
struct Memento {
    state: String,
}
// 实现备忘录对象
impl Memento {
    fn new(state: String) -> Self {
        Memento { state }
    }
    fn get_state(&self) -> String {
        self.state.clone()
    }
}
// 定义原发器对象
struct Originator {
    state: String,
}
// 实现原发器对象
impl Originator {
    fn new() -> Self {
        Originator { state: String::new() }
    }
    fn set_state(&mut self, state: String) {
        self.state = state;
    }
    fn create_memento(&self) -> Memento {
        Memento::new(self.state.clone())
    }
    fn restore_state(&mut self, memento: Memento) {
        self.state = memento.get_state();
    }
}
// 定义管理者对象
struct Caretaker {
    mementos: Vec<Memento>,
}
// 实现管理者对象
impl Caretaker {
    fn new() -> Self {
        Caretaker { mementos: Vec::new() }
    }
    fn add_memento(&mut self, memento: Memento) {
        self.mementos.push(memento);
    }
    fn get_memento(&self, index: usize) -> Option<Memento> {
        self.mementos.get(index).cloned()
    }
}
fn main() {
    // 创建原发器对象和管理者对象
    let mut originator = Originator::new();
    let mut caretaker = Caretaker::new();
     // 设置原发器状态并创建备忘录
    originator.set_state("State 1".to_string());
    let memento1 = originator.create_memento();
    caretaker.add_memento(memento1);
     // 设置原发器状态并创建备忘录
    originator.set_state("State 2".to_string());
    let memento2 = originator.create_memento();
    caretaker.add_memento(memento2);
     // 恢复原发器状态
    if let Some(memento) = caretaker.get_memento(0) {
        originator.restore_state(memento);
    }
     // 打印当前原发器状态
    println!("Current state: {}", originator.state);
}

在上述代码中,我们首先定义了备忘录对象Memento,它包含一个状态字段state。然后,我们定义了原发器对象Originator,它包含一个状态字段state,并提供了设置状态、创建备忘录和恢复状态的方法。接下来,我们定义了管理者对象Caretaker,它维护了一个备忘录对象的集合,并提供了添加备忘录和获取备忘录的方法。
在main函数中,我们创建了原发器对象originator和管理者对象caretaker。然后,我们设置原发器的状态并创建备忘录,将备忘录添加到管理者中。接着,我们恢复原发器的状态,并打印当前的原发器状态。
通过备忘录模式,我们可以在不暴露对象内部状态的情况下,捕获和恢复对象的状态。这提供了对象状态的封装和可恢复性。

关注我,学习Rust不迷路!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值