デザインパターン-Memento



Mementoパターンとは

Memento(メメント)パターンとは、オブジェクトの時点毎の操作内容・状態を記録しておき、以前の状態の復帰、操作の再実行を行えるようにするパターンです。

オブジェクトのスナップショットを残すことで、「undo,redo,history」などの機能を実現することが可能になります。

「Memento」とは「形見・記念」を意味します。


構成要素


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


関連ページ



スポンサード リンク