Skip to main content

Memento Pattern

Command Pattern 


Gamma Categorization: Behavioral Design Pattern
Summary: Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later.

Sample Code

Problem: We want to apply several commands on the digital camera.

Code

public class DigitalCameraFirmware
{
    public string Name { getset; }
    public byte[] Data { getset; }

    public Memento SaveMemento()
    {
        return new Memento(NameData);
    }

    public void RestoreMemento(Memento memento)
    {
        this.Name = memento.Name;
        this.Data = memento.Data;
    }
}

public class Memento
{
    public string Name { getprivate set; }
    public byte[] Data { getprivate set; }

    public Memento(string namebyte[] data)
    {
        this.Name = name;
        this.Data = data;
    }
}

public class FirmwareMemory
{
    private Memento _memento;

    public Memento Memento
    {
        set { _memento = value; }
        get { return _memento; }
    }
}

Usage

var cameraFirmware = new DigitalCameraFirmware { Name = "v1.0"Data = new byte[1024] };

System.Console.WriteLine($"Current firmware version: {cameraFirmware.Name}");

FirmwareMemory memory = new FirmwareMemory();
memory.Memento = cameraFirmware.SaveMemento();

cameraFirmware.Name = "v2.0";
cameraFirmware.Data = new byte[1024];

System.Console.WriteLine($"Current firmware version: {cameraFirmware.Name}");

// something fails with the new firmware, so we want to restore the previous one
cameraFirmware.RestoreMemento(memory.Memento);

System.Console.WriteLine($"Current firmware version: {cameraFirmware.Name}");

Output

Current firmware version: v1.0
Current firmware version: v2.0
Current firmware version: v1.0

Comments