Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Piotr Szawdyński
Wzorce projektowe

pamiątka

[wzorzec projektowy] Umożliwia zapamiętanie stanu obiektu oraz późniejsze jego odtworzenie.

Budowa wzorca projektowego

C/C++
struct RStanObiektu
{
    //INFO: dane obiektu, które mają być zapamiętywane i przywracane
};

class CPamiatkaObiektu
{
private:
    RStanObiektu m_zapamietanyStan;
public:
    CPamiatkaObiektu( const RStanObiektu & stan )
        : m_zapamietanyStan( stan )
    {
    }
    const RStanObiektu & odczytajStan() const
    {
        return m_zapamietanyStan;
    }
};

class CObiektProgramu
{
private:
    RStanObiektu m_stanObiektu;
public:
    CPamiatkaObiektu * zapiszStan() const
    {
        return new CPamiatkaObiektu( m_stanObiektu );
    }
   
    void wczytajStan( const CPamiatkaObiektu & pamiatka )
    {
        m_stanObiektu = pamiatka.odczytajStan();
    }
};

class CZarzadzajPamiatkamiObiektu
{
    std::vector < CPamiatkaObiektu *> m_vPamiatki;
    //INFO: ta klasa nie ma najmniejszego znaczenia
    //z punktu widzenia omawianego wzorca - prezentuje
    //jedynie możliwy sposób przechowywania zbioru pamiątek
};

Opis szczegółowy

Pamiątka (ang. Memento) - wzorzec projektowy, który umożliwia zapamiętanie stanu obiektu oraz późniejsze jego odtworzenie.

Zastosowania wzorca pamiątka

Wzorzec pamiątki stosujemy gdy:
  • chcemy przechowywać stany obiektów i mieć możliwość ich przywrócenia w dowolnym momencie;
  • chcemy zachować hermetyzację obiektu, którego stan ma być zapamiętywany.

Pozostałe informacje

Wzorzec projektowy pamiątki w pierwotnej formie jest bardzo niewygodny w użyciu. Zazwyczaj wzorzec pamiątki implementuje się w postaci szablonu, pozbywając się jednocześnie potrzeby tworzenia struktury do przechowywania informacji. Szkielet implementacji opartej o szablony może więc wyglądać tak:
C/C++
template < class KlasaT >
class TPamiatka
{
    KlasaT m_stan;
public:
    TPamiatka( const KlasaT & stan )
        : m_stan( stan )
    {
    }
    const KlasaT & odczytajStan() const
    {
        return m_stan;
    }
};

class CObiektProgramu
{
private:
    //INFO: dane obiektu
    int m_zmienna;
public:
    TPamiatka < CObiektProgramu >* zapiszStan() const
    {
        return new TPamiatka < CObiektProgramu >( * this );
    }
   
    void wczytajStan( const TPamiatka < CObiektProgramu >& pamiatka )
    {
        const CObiektProgramu & stan = pamiatka.odczytajStan();
        m_zmienna = stan.m_zmienna;
        //INFO: itd
    }
};