Rust语言之GoF设计模式:备忘录Memento模式


Memento允许制作对象状态的快照并能在以后恢复这些状态。

trait Memento<T> {
    fn restore(self) -> T;
    fn print(&self);
}

struct Originator {
    state: u32,
}

impl Originator {
    pub fn save(&self) -> OriginatorBackup {
        OriginatorBackup {
            state: self.state.to_string(),
        }
    }
}

struct OriginatorBackup {
    state: String,
}

impl Memento<Originator> for OriginatorBackup {
    fn restore(self) -> Originator {
        Originator {
            state: self.state.parse().unwrap(),
        }
    }

    fn print(&self) {
        println!("Originator backup: '{}'", self.state);
    }
}

fn main() {
    let mut history = Vec::<OriginatorBackup>::new();

    let mut originator = Originator { state: 0 };

    originator.state = 1;
    history.push(originator.save());

    originator.state = 2;
    history.push(originator.save());

    for moment in history.iter() {
        moment.print();
    }

    let originator = history.pop().unwrap().restore();
    println!(
"Restored to state: {}", originator.state);

    let originator = history.pop().unwrap().restore();
    println!(
"Restored to state: {}", originator.state);
}

事件溯源 EventSourcing 属于一种备忘录模式,使用事件播放投射来获得历史上任何一个时刻的状态,也成为时光旅行。

thalo: Rust的事件溯源套件