Mementoパターンとは | GoFデザインパターン

記事内に広告が含まれています。

Mementoパターンは、オブジェクトの内部状態をキャプチャし、その状態を後で復元できるようにするためのデザインパターンです。

このパターンは、主にオブジェクトの状態の管理や履歴の管理に使用されます。

この記事では、Mementoパターンの概念やその使い方について解説し、Java、C++、C#、VB.NETでの実装サンプルも紹介します。

Mementoパターンとは

まず、Mementoパターンの基本的な概念について説明します。

このパターンは、オブジェクトの内部状態を保存し、その状態を後で復元するために使用されます。

通常、内部状態はオブジェクトの外部からはアクセスできないため、Mementoパターンはそのような状態管理に適しています。

Mementoパターンの使い方

Mementoパターンの使い方は非常に直感的です。

このパターンは主に、”発起人”(Originator)、”メメント”(Memento)、および”管理者”(Caretaker)の3つの役割で構成されています。

Originator(発起人)

Originatorは、オブジェクトの内部状態を保持し、それをMementoに保存します。

Memento(メメント)

Mementoは、Originatorの内部状態を保存するオブジェクトです。

このオブジェクトは、外部からの直接アクセスを制限するために厳重に管理されます。

Caretaker(管理者)

Caretakerは、Mementoオブジェクトを管理し、Originatorが必要なときにその状態を復元できるようにします。

Mementoパターン実装サンプル

以下に、Mementoパターンの実装サンプルをJava、C++、C#、VB.NETで紹介します。

Javaの実装例


public class Memento {
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }
}

public class Originator {
    private String state;

    public void setState(String state) {
        System.out.println("State set to: " + state);
        this.state = state;
    }

    public String getState() {
        return state;
    }

    public Memento saveStateToMemento() {
        return new Memento(state);
    }

    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

public class Caretaker {
    private List mementoList = new ArrayList();

    public void add(Memento state) {
        mementoList.add(state);
    }

    public Memento get(int index) {
        return mementoList.get(index);
    }
}

C++の実装例


#include 
#include 
#include 
using namespace std;

class Memento {
private:
    string state;
public:
    Memento(string state) {
        this->state = state;
    }

    string getState() {
        return state;
    }
};

class Originator {
private:
    string state;
public:
    void setState(string state) {
        cout << "State set to: " << state << endl;
        this->state = state;
    }

    string getState() {
        return state;
    }

    Memento saveStateToMemento() {
        return Memento(state);
    }

    void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
};

class Caretaker {
private:
    vector mementoList;
public:
    void add(Memento state) {
        mementoList.push_back(state);
    }

    Memento get(int index) {
        return mementoList[index];
    }
};

C#の実装例


using System;
using System.Collections.Generic;

class Memento {
    private string state;

    public Memento(string state) {
        this.state = state;
    }

    public string GetState() {
        return state;
    }
}

class Originator {
    private string state;

    public void SetState(string state) {
        Console.WriteLine("State set to: " + state);
        this.state = state;
    }

    public string GetState() {
        return state;
    }

    public Memento SaveStateToMemento() {
        return new Memento(state);
    }

    public void GetStateFromMemento(Memento memento) {
        state = memento.GetState();
    }
}

class Caretaker {
    private List mementoList = new List();

    public void Add(Memento state) {
        mementoList.Add(state);
    }

    public Memento Get(int index) {
        return mementoList[index];
    }
}

VB.NETの実装例


Public Class Memento
    Private state As String

    Public Sub New(state As String)
        Me.state = state
    End Sub

    Public Function GetState() As String
        Return state
    End Function
End Class

Public Class Originator
    Private state As String

    Public Sub SetState(state As String)
        Console.WriteLine("State set to: " & state)
        Me.state = state
    End Sub

    Public Function GetState() As String
        Return state
    End Function

    Public Function SaveStateToMemento() As Memento
        Return New Memento(state)
    End Function

    Public Sub GetStateFromMemento(memento As Memento)
        state = memento.GetState()
    End Sub
End Class

Public Class Caretaker
    Private mementoList As New List(Of Memento)()

    Public Sub Add(state As Memento)
        mementoList.Add(state)
    End Sub

    Public Function Get(index As Integer) As Memento
        Return mementoList(index)
    End Function
End Class

まとめ

Mementoパターンは、オブジェクトの内部状態を保存して復元するためのデザインパターンであり、履歴の管理やアプリケーションの取り消し操作に役立ちます。

この記事では、Java、C++、C#、VB.NETでの実装例を示しました。

このパターンを使用することで、状態の管理がより柔軟になり、アプリケーションの保守性が向上します。

オブジェクト指向プログラミングにおけるGoFの23のデザインパターン
デザインパターンは、ソフトウェア設計の問題を効果的に解決するための再利用可能な解決策です。本記事では、GoF(Gang ...
【PR】
オブジェクト指向学習におすすめの本
オブジェクト指向
スポンサーリンク
タイトルとURLをコピーしました