«Պահպանող (նախագծման ձևանմուշ)»–ի խմբագրումների տարբերություն

Առանց խմբագրման ամփոփման
(Նոր էջ «{{Տեղեկաքարտ նախագծման մոդել | Անուն = Պահպանող | Անգլերեն անվանում` = Memento pattern | Տեսակ` = Վարքագծային...»:)
 
No edit summary
 
Պահպանող ձևանմուշն օգտագործվում է երեք օբյեկտների հետ միասին`''originator'', ''caretaker'' և ''memento'': ''Originator''-ը օբյեկտ է, որն ունի ներքին վիճակ: ''Caretaker''-ը պատրաստ է գործողություն իրականացնել originator-ի հետ, բայց այն պետք է հնարավորություն ընձեռնի գործողությունները հետ շրջել: Caretaker-ը Memento օբյեկտի հետ աշխատելիս սկզբում դիմում է originator-ին: Դրանից հետո կատարվում է նեյտրալ գործողություն: Որպեսզի գործողությունը հետ վերադարձվի նախորդ վիճակին, memento օբյեկտը վերադարձվու է originator-ին: Memento օբյեկտն ինքն իրենով համարվում է ոչ թափանցիկ օբյեկտ և caretaker-ն ինքըչի կարող փոփոխություն ենթարկել memento-յին: Ձևանմուշի օգտագործման ժամանակ պետք է հոգ տանել, որ originator-ը կարող է փոփոխել օբյեկտները կամ ռեսուրսները:
 
==Օրինակներ==
===Ձևանմուշի ոչ ստանդարտ տարբերակ C++ լեզվով===
<source lang="cpp">
#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();
 
}
</source>
 
===Ստանդարտ տարբերկ С#:===
<source lang="csharp">
//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
 
</source>
 
=== Ստանդարտ տարբերակ Java լեզվով ===
<source lang="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
*/
</source>
 
== Ծանոթագրություններ ==
106 142

edits