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

Վիքիպեդիայից՝ ազատ հանրագիտարանից
Content deleted Content added
Նոր էջ «{{Տեղեկաքարտ նախագծման մոդել | Անուն = Պահպանող | Անգլերեն անվանում` = 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
 */

Ծանոթագրություններ