十分钟学会一个设计模式---行为模式---备忘录模式

69 阅读1分钟

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象 提供一个可回滚的操作

为了节约内存,可使用原型模式+备忘录模式

// 存实际对象的备份状态的对象
class Memento {
private:
    string status;
public:
    Memento(string status) {
        this->status = status;
    }
    string GetStatus() {
        return this->status;
    }
};

// 实际用的对象
class Originator {
private:
    string state;
public:
    void SetState(string status) {
        this->state = status;
    }

    string GetState() {
        return state;
    }

    Memento *SaveStateToMento() {
        return new Memento(state);
    }

    void GetStateFromMemento(Memento memento) {
        this->state = memento.GetStatus();
    }
};

// 负责从Memento中恢复状态
class CareTaker {
private:
    // 该处可结合原型模式,减少内存占用
    vector<Memento> vector;
public:
    void Add(Memento memento) {
        vector.emplace_back(memento);
    }
    Memento Get(int index) {
        return vector[index];
    }
};



int main() {
    Originator *originator = new Originator;
    CareTaker *careTaker = new CareTaker;
    // 状态1
    originator->SetState("status1");
    // 状态2
    originator->SetState("status2");
    careTaker->Add(*originator->SaveStateToMento());
    // 状态3
    originator->SetState("status3");
    careTaker->Add(*originator->SaveStateToMento());

    originator->SetState("status4");

    cout << "current state" << originator->GetState() << endl;
    // 恢复状态2
    originator->GetStateFromMemento(careTaker->Get(0));
    cout << "current state" << originator->GetState() << endl;

    // 恢复状态3
    originator->GetStateFromMemento(careTaker->Get(1));
    cout << "current state" << originator->GetState() << endl;
}