デザインパターン-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


関連ページ