«Պահպանող (նախագծման ձևանմուշ)»–ի խմբագրումների տարբերություն
Նոր էջ «{{Տեղեկաքարտ նախագծման մոդել | Անուն = Պահպանող | Անգլերեն անվանում` = Memento pattern | Տեսակ` = Վարքագծային...»: |
No edit summary |
||
Տող 14. | Տող 14. | ||
Պահպանող ձևանմուշն օգտագործվում է երեք օբյեկտների հետ միասին`''originator'', ''caretaker'' և ''memento'': ''Originator''-ը օբյեկտ է, որն ունի ներքին վիճակ: ''Caretaker''-ը պատրաստ է գործողություն իրականացնել originator-ի հետ, բայց այն պետք է հնարավորություն ընձեռնի գործողությունները հետ շրջել: Caretaker-ը Memento օբյեկտի հետ աշխատելիս սկզբում դիմում է originator-ին: Դրանից հետո կատարվում է նեյտրալ գործողություն: Որպեսզի գործողությունը հետ վերադարձվի նախորդ վիճակին, memento օբյեկտը վերադարձվու է originator-ին: Memento օբյեկտն ինքն իրենով համարվում է ոչ թափանցիկ օբյեկտ և caretaker-ն ինքըչի կարող փոփոխություն ենթարկել memento-յին: Ձևանմուշի օգտագործման ժամանակ պետք է հոգ տանել, որ originator-ը կարող է փոփոխել օբյեկտները կամ ռեսուրսները: |
Պահպանող ձևանմուշն օգտագործվում է երեք օբյեկտների հետ միասին`''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> |
|||
== Ծանոթագրություններ == |
== Ծանոթագրություններ == |
07:11, 12 Դեկտեմբերի 2015-ի տարբերակ
Պահպանող | |
---|---|
Տեսակ | նախագծման մոդել |
Պահպանող (անգլ.՝ 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
*/
Ծանոթագրություններ
|