デザインパターン-Memento
Mementoパターンとは
Memento(メメント)パターンとは、オブジェクトの時点毎の操作内容・状態を記録しておき、以前の状態の復帰、操作の再実行を行えるようにするパターンです。
オブジェクトのスナップショットを残すことで、「undo,redo,history」などの機能を実現することが可能になります。
「Memento」とは「形見・記念」を意味します。
構成要素
- Originator(作成者)
- オリジナルとなるクラス
- Memento(形見・記念品)
- ある時点でのインスタンスの情報を保持する。
- Caretaker(世話人)
- Mementoの状態を管理する
- 状態を保存/復元する場合は、「Originator」に指示を出します。
rubyによるMementoパターンの実装
#!/usr/bin/env ruby
# ある時点でのインスタンスの情報を保持する。
class Memento
def initialize(string)
@string = string
end
def get_string
return(@string)
end
end
# 作成者
class Originator
def initialize
@string = ""
end
# 記憶を保存する
def create_memento
@memento = Memento.new(@string)
end
# 記憶を復元する
def restore_memento(memento)
@memento = memento
@string = memento.get_string
end
def set_string(string)
@string = string
end
def get_string
return(@string)
end
end
# Mementoの状態を管理する
class Caretaker
def initialize
@memento_list = []
end
def add_memento(memento)
@memento_list.push(memento)
end
def get_memento
return(@memento_list.pop)
end
end
caretaker = Caretaker.new
originator = Originator.new
originator.set_string("state1")
originator.set_string("state2")
# save
caretaker.add_memento(originator.create_memento)
puts(originator.get_string) # state2
originator.set_string("state3")
puts(originator.get_string) # state3
# undo
originator.restore_memento(caretaker.get_memento)
puts(originator.get_string) # state2
関連ページ
- デザインパターン
- デザインパターン-Iterator
- デザインパターン-TemplateMethod
- デザインパターン-ChainOfResponsibility
- デザインパターン-Command
- デザインパターン-Interpreter
- デザインパターン-Mediator
- デザインパターン-Memento
- デザインパターン-Observer
- デザインパターン-State
- デザインパターン-Strategy
- デザインパターン-Visitor