Պահպանող (նախագծման ձևանմուշ)

Պահպանող
ՏեսակՎարքագծային
Նշանակությունտալիս է օբյեկտները հետ գլորելու հնարավորություն
Նկարագրությունը ԳօՖի
"Design Patterns" գրքում
Այո

Պահպանող (անգլ.՝ Memento pattern), վարքագծային նախագծման ձևանմուշ, որը հնարավորություն է տալիս վերականգնել օբյեկտի նախնական վիճակը՝այն հետ գլորելու միջոցով։

Պահպանող ձևանմուշն օգտագործվում է երեք օբյեկտների հետ միասին՝originator, caretaker և memento: Originator-ը օբյեկտ է, որն ունի ներքին վիճակ։ Caretaker-ը պատրաստ է գործողություն իրականացնել originator-ի հետ, բայց այն պետք է հնարավորություն ընձեռնի գործողությունները հետ շրջել։ Caretaker-ը Memento օբյեկտի հետ աշխատելիս սկզբում դիմում է originator-ին։ Դրանից հետո կատարվում է նեյտրալ գործողություն։ Որպեսզի գործողությունը հետ վերադարձվի նախորդ վիճակին, memento օբյեկտը վերադարձվու է originator-ին։ Memento օբյեկտն ինքն իրենով համարվում է ոչ թափանցիկ օբյեկտ և caretaker-ն ինքըչի կարող փոփոխություն ենթարկել memento-յին։ Ձևանմուշի օգտագործման ժամանակ պետք է հոգ տանել, որ originator-ը կարող է փոփոխել օբյեկտները կամ ռեսուրսները։

Ձևանմուշի ոչ ստանդարտ տարբերակ C++ լեզվով

[խմբագրել | խմբագրել կոդը]
#include <iostream>
using namespace std;

class Originator {

    int state;

public:

    Originator();

    class Memento;

    Memento* getMemento();
    void setState(int);
    void dumpState();

    class Memento {

        friend class Originator;

    private:

        int state;
        Originator* org;

    public:

        Memento();
        void restoreState();

    };

};

Originator::Originator(): state(0) {

}

void Originator::setState(int s) {
    state = s;
}

void Originator::dumpState() {
    cout << "State: " << state << endl;
}

Originator::Memento::Memento(): state(0) {

}

Originator::Memento* Originator::getMemento() {
    Originator::Memento* m = new Originator::Memento();
    m->org = this;
    m->state = state;
    return m;
}

void Originator::Memento::restoreState() {

    org->state = state;
}

int main(void) {

    Originator org;
    org.setState(1);
    org.dumpState();

    Originator::Memento* m1 = org.getMemento();

    org.setState(2);
    org.dumpState();

    m1->restoreState();
    org.dumpState();

}

Ստանդարտ տարբերակ С#:

[խմբագրել | խմբագրել կոդը]
//This structural code demonstrates the Memento pattern which temporary saves and restores another object's internal state.

// Memento pattern -- Structural example

using System;
 
namespace DoFactory.GangOfFour.Memento.Structural
{
  /// <summary>
  /// MainApp startup class for Structural
  /// Memento Design Pattern.
  /// </summary>
  class MainApp
  {
    /// <summary>
    /// Entry point into console application.
    /// </summary>
    static void Main()
    {
      Originator o = new Originator();
      o.State = "On";
 
      // Store internal state
      Caretaker c = new Caretaker();
      c.Memento = o.CreateMemento();
 
      // Continue changing originator
      o.State = "Off";
 
      // Restore saved state
      o.SetMemento(c.Memento);
 
      // Wait for user
      Console.ReadKey();
    }
  }
 
  /// <summary>
  /// The 'Originator' class
  /// </summary>
  class Originator
  {
    private string _state;
 
    // Property
    public string State
    {
      get { return _state; }
      set
      {
        _state = value;
        Console.WriteLine("State = " + _state);
      }
    }
 
    // Creates memento
    public Memento CreateMemento()
    {
      return (new Memento(_state));
    }
 
    // Restores original state
    public void SetMemento(Memento memento)
    {
      Console.WriteLine("Restoring state...");
      State = memento.State;
    }
  }
 
  /// <summary>
  /// The 'Memento' class
  /// </summary>
  class Memento
  {
    private string _state;
 
    // Constructor
    public Memento(string state)
    {
      this._state = state;
    }
 
    // Gets or sets state
    public string State
    {
      get { return _state; }
    }
  }
 
  /// <summary>
  /// The 'Caretaker' class
  /// </summary>
  class Caretaker
  {
    private Memento _memento;
 
    // Gets or sets memento
    public Memento Memento
    {
      set { _memento = value; }
      get { return _memento; }
    }
  }
}

Output
State = On
State = Off
Restoring state:
State = On

Ստանդարտ տարբերակ Java լեզվով

[խմբագրել | խմբագրել կոդը]
public class Memento {
    private final String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }
}

public class Caretaker {
    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}

public class Originator {
    private String state;

    public void setState(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }

    public Memento saveState() {
        return new Memento(state);
    }

    public void restoreState(Memento memento) {
        this.state = memento.getState();
    }
}

public class Application {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        originator.setState("on");
        System.out.printf("State is %s\n", originator.getState());
        caretaker.setMemento(originator.saveState());

        originator.setState("off");
        System.out.printf("State is %s\n", originator.getState());

        originator.restoreState(caretaker.getMemento());
        System.out.printf("State is %s\n", originator.getState());
    }
}

/*
 * Output:
 * State is on
 * State is off
 * State is on
 */