**Պահպանող** (անգլ.՝ 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
 \*/

```

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * դ
* ք
* խ
Նախագծման ձևանմուշներ |
| --- |
|  |
| ԳօՖիձևանմուշներ | 

|  |  |
| --- | --- |
| Ստեղծող | Աբստրակտ ֆաբրիկա • Կառուցող • Ֆաբրիկային մեթոդ • Նախատիպ • Եզակի օգտագործման |
| Կառուցվածքային | Ադապտեր • Կամուրջ • Կազմող • Դեկորատոր • Ճակատ • Հարմարեցնող • Պրոքսի |
| Վարքագծային | Պարտականությունների շղթա • Հրաման • Թարգմանիչ • Իտերատոր • Միջնորդ • Պահպանող • Դիտորդ • Վիճակ • Մարտավարություն • Կաղապարային մեթոդ • Այցելող |

 |
|  |
| Ստեղծող ձևանմուշներ | Ծույլ բեռնում • Բազմակի օգտագործման • Օբյեկտների ավազան • Ռեսուրսի ստանալը ինիցիալիզացիա է |
|  |
| Կառուցվածքային ձևանմուշներ | Ճակատը հսկող • Մոդուլ |
|  |
| Համաձայնեցման ձևանմուշներ | Ակտիվ օբյեկտ • Հենվող • Մեկուսացում կրկնակի ստուգումով • Ասինքրոն կանչի մեթոդ • Պահպանվող կախոց • Ռեգիստրացնող • Կողպեքավորող • Մոնիտոր • Նախագործող • Ապագործող • Ընթերցողներ-գրողի կողպեք • Պլանավորման • Հոսքերի ավազանի • Հոսքերի լոկալ հիշողություն |
|  |
| Ճարտարապետական ձևանմուշներ | Ճակատը հսկող ձևանմուշ • Զավթող ձևանմուշ • ձևանմուշի ներկայացման վերահսկում • Բազմաշերտ • Հատկորոշում • Հրատարակող-ստորագրող • Մերկ օբյեկտներ • Ծառայության լոկատոր • Ակտիվ գրառման • Բազմության իդենտիֆիկացման • Data access object • Data transfer object |
|  |
| Այլ ձևանմուշներ | Կախվածության ներդնում • Mock օբյեկտ • Զրոյական օբյեկտ • Ծառայող • Թունելային տարատեսակի |

 |