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での実装例を示しました。
このパターンを使用することで、状態の管理がより柔軟になり、アプリケーションの保守性が向上します。