Պահպանող | |
---|---|
Տեսակ | Վարքագծային |
Նշանակություն | տալիս է օբյեկտները հետ գլորելու հնարավորություն |
Նկարագրությունը ԳօՖի "Design Patterns" գրքում | Այո |
Պահպանող (անգլ.՝ Memento pattern), վարքագծային նախագծման ձևանմուշ, որը հնարավորություն է տալիս վերականգնել օբյեկտի նախնական վիճակը՝այն հետ գլորելու միջոցով։
Պահպանող ձևանմուշն օգտագործվում է երեք օբյեկտների հետ միասին՝originator, caretaker և memento: Originator-ը օբյեկտ է, որն ունի ներքին վիճակ։ Caretaker-ը պատրաստ է գործողություն իրականացնել originator-ի հետ, բայց այն պետք է հնարավորություն ընձեռնի գործողությունները հետ շրջել։ Caretaker-ը Memento օբյեկտի հետ աշխատելիս սկզբում դիմում է originator-ին։ Դրանից հետո կատարվում է նեյտրալ գործողություն։ Որպեսզի գործողությունը հետ վերադարձվի նախորդ վիճակին, memento օբյեկտը վերադարձվու է originator-ին։ Memento օբյեկտն ինքն իրենով համարվում է ոչ թափանցիկ օբյեկտ և caretaker-ն ինքըչի կարող փոփոխություն ենթարկել memento-յին։ Ձևանմուշի օգտագործման ժամանակ պետք է հոգ տանել, որ originator-ը կարող է փոփոխել օբյեկտները կամ ռեսուրսները։
#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
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
*/
|