Heim > Backend-Entwicklung > C#.Net-Tutorial > Ein kurzes Verständnis des Memomusters für C++-Entwurfsmuster

Ein kurzes Verständnis des Memomusters für C++-Entwurfsmuster

黄舟
Freigeben: 2017-01-17 13:30:56
Original
1110 Leute haben es durchsucht

Memento-Modus: Erfassen Sie den internen Zustand eines Objekts und speichern Sie diesen Zustand außerhalb des Objekts, ohne die Kapselung zu zerstören. Dadurch können Sie das Objekt später wieder in seinen ursprünglich gespeicherten Zustand versetzen.

Musterimplementierung:

[code]struct State{
    wchar_t wcsState[260];
};

class Memento{
public:
    Memento(State *pState): m_pState(pState) {}
    State *GetState() { return m_pState; }

private:
    friend class Originator;

    State *m_pState;
};

class Originator{
public:
    Originator() : m_pState(NULL) {}
    ~Originator(){
        //Delete the storage of the state
        if(m_pState){
            delete m_pState;
            m_pState = NULL;
        }
    }

    void SetMemento(Memento *pMemento);

    Memento * CreateMemento();

    void SetValue(wchar_t *val){
        memset(wcsValue, 0, 260 * sizeof(wchar_t));
        wcscpy_s(wcsValue, 260, val);
    }

    void PrintState() { std::wcout << wcsValue << std::endl; } 

private:
    State *m_pState; //To store the object&#39;s state
    wchar_t wcsValue[260]; //This is the object&#39;s real data
};

Memento *Originator::CreateMemento(){
    m_pState = new State;
    if(m_pState == NULL)
        return NULL;
    Memento *pMemento = new Memento(m_pState);

    wcscpy_s(m_pState->wcsState, 260, wcsValue);  //Backup the value

    return pMemento;
}

void Originator::SetMemento(Memento *pMemento){
    m_pState = pMemento->GetState();
    //Recovery the data
    memset(wcsValue, 0, 260 * sizeof(wchar_t));
    wcscpy_s(wcsValue, 260, m_pState->wcsState);
}

//Manager the Memento
class Caretaker{
public:
    Memento *GetMemento() { return m_pMemento; }
    void SetMemento(Memento *pMemento){
        //Free the previous Memento
        if(m_pMemento){
            delete m_pMemento;
            m_pMemento = NULL;
        }

        //set the new Memento
        m_pMemento = pMemento;
    }
private:
    Memento *m_pMemento;
};
Nach dem Login kopieren

Kunde:

[code]int main(){ 
    Originator *pOriginator = new Originator();
    pOriginator->SetValue(L"on");
    pOriginator->PrintState();  //OutPut: on

    //Now I backup the state
    Caretaker *pCaretaker = new Caretaker();
    pCaretaker->SetMemento(pOriginator->CreateMemento());

    //Set the new state
    pOriginator->SetValue(L"off");
    pOriginator->PrintState(); //OutPut: off

    //Recovery to the old state
    pOriginator->SetMemento(pCaretaker->GetMemento());
    pOriginator->PrintState(); //OutPut: on

    if(pCaretaker)
        delete pCaretaker;
    if(pOriginator);
        delete pOriginator;
    return 0;
}
Nach dem Login kopieren

Das Obige ist der Inhalt des C++-Designmusters, kurzes Verständnis des Memomusters und mehr Für verwandte Inhalte achten Sie bitte auf die chinesische PHP-Website (www.php.cn)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage