Memento

デザインパターンとは

デザインパターンとはオブジェクト思考開発における先人たちが作り上げてきた便利な設計図です。

Gang of Four通称Gofが1994年に出版した『オブジェクト指向における再利用のためのデザインパターン』の中で23個の設計図が紹介されています。

Note

デザインパターンのサンプルコードはSwift4でまとめます。

メメントパターンとは?

メメントパターンはオブジェクトの状態を保存しておけるパターンです。ある時の状態を記憶しておくことで、インスタンスの状態を復元することが可能です。

サンプルコード

サンプルでは回復魔法が使える魔法使いを例にしてコードを作ってみました。

登場人物は魔法使いのマーリンと戦士です。

魔法使いクラス

このクラスではHPの記憶(createMemento)と記憶したHPの取得(getMementoValue)を作成しています。

class Witch {
    var memory: Int
    
    init(value: Int) {
        memory = value
    }
    
    func createMemento() -> Memento {
        return Memento(value: memory)
    }
    func getMementoValue(memento: Memento) -> Int{
        return memento.saveValue 
    }
}

Memento(記憶)クラス

このクラスでは1つの値(HP)を保存しています。今回は1つだけでしたが複数保存しておきたい場合は増やして大丈夫です。

class Memento {
    var saveValue: Int
    
    init(value: Int) {
        saveValue = value
    }
}

呼び出し元

var warriorHP = 100
let marlin = Witch(value: warriorHP)
//魔法使いマーリンが戦士のHPを記憶(HPMAXの状態)
let memento = marlin.createMemento()
print("モンスターが戦士に攻撃!13のダメージ")
warriorHP  = warriorHP - 13
print("戦士のHPは\(warriorHP)です")


print("モンスターが戦士に攻撃!20のダメージ")
warriorHP = warriorHP - 20

print("戦士のHPは\(warriorHP)です")

//魔法使いマーリンの時間魔法(メメント)でHP回復
warriorHP = marlin.getMementoValue(memento: memento)
print("回復魔法を使いました戦士のHPは\(warriorHP)です")

コンソール

モンスターが戦士に攻撃!13のダメージ
戦士のHPは87です
モンスターが戦士に攻撃!20のダメージ
戦士のHPは67です
回復魔法を使いました戦士のHPは100です

コード一覧

import UIKit

class Witch {
    var memory: Int
    
    init(value: Int) {
        memory = value
    }
    
    func createMemento() -> Memento {
        return Memento(value: memory)
    }
    func getMementoValue(memento: Memento) -> Int{
        return memento.saveValue
        
    }
}

class Memento {
    var saveValue: Int
    
    init(value: Int) {
        saveValue = value
    }
}

var warriorHP = 100
let marlin = Witch(value: warriorHP)
//魔法使いマーリンが戦士のHPを記憶(HPMAXの状態)
let memento = marlin.createMemento()
print("モンスターが戦士に攻撃!13のダメージ")
warriorHP  = warriorHP - 13
print("戦士のHPは\(warriorHP)です")


print("モンスターが戦士に攻撃!20のダメージ")
warriorHP = warriorHP - 20

print("戦士のHPは\(warriorHP)です")

//魔法使いマーリンの時間魔法(メメント)でHP回復
warriorHP = marlin.getMementoValue(memento: memento)
print("回復魔法を使いました戦士のHPは\(warriorHP)です")

参考文献

Memento パターン

Swiftで学ぶデザインパターン7 (Memento パターン)

デザインパターン

前の記事

Builder
デザインパターン

次の記事

Visitor