Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 524 - Swiftでデザインパターン: Memento(メメント)

やっと、新しいデザインパターンの勉強に入りました。

www.raywenderlich.com

このチュートリアルがまだ終わらないです。

本業も忙しくなかなかプログラミングの勉強に打ち込めないのが悩みですね(^_^;)

今日は「メメント」がテーマです。調べて見るとありました!私のお師匠さんが既に分かり易い解説をしてくれてました。

メメント・パターンとは、オブジェクトの現在の状態を切り取り、外部に保存する事で、オブジェクトの変化をした後も以前の状態に復元する方法です。

私も持っている定番の「デザイン・パターン」解説本

これを簡単に説明しています。
llcc.hatenablog.com
しめ鯖さんの解説をクラス図で説明すると
f:id:yataiblue:20151215181944j:plain
これをSwiftでコードすると以下のようになります。

import UIKit

var str = "Hello, playground"

class Originator {
    var param1 = 0
    var param2 = 1
    
    func createMemento() -> Memento {
        return Memento(param1: param1, param2: param2)
    }
    
    func setMemento(memento: Memento) {
        param1 = memento.param1
        param2 = memento.param2
    }
}

class Memento {
    var param1: Int
    var param2: Int
    
    init(param1: Int, param2: Int) {
        self.param1 = param1
        self.param2 = param2
    }
}

let dataManager = Originator()
// オリジネータ・クラスだけインスタンス化します

dataManager.param1 = 7
print(dataManager.param1) // → 7
// オリジネータ・インスタンスのparam1を変更

let memento = dataManager.createMemento()
// オリジネータ・インスタンスを使って
// メメント・インスタンスを作ります
// これで外部にparam1のデータ「7」が保存されます

dataManager.param1 = 4
print(dataManager.param1) // → 4
// オリジネータ・インスタンスのparam1を変更

dataManager.setMemento(memento: memento)
print("\(dataManager.param1)\(dataManager.param2)") // → 7と1
// メメント・インスタンスを使って変化する前の値に戻ります

このコードにはメメントをコントロールするCaretakerクラスが入っていないので実際のコーディングで見ていきます。

今日はここまで。