LoginSignup
0
0

More than 3 years have passed since last update.

memento pattern

ケース

オブジェクトの状態を元に戻したいとき

結果

pros

カプセル化を壊さない。
Original class を汚さない

cons

言語によってはnarrow インターフェイス, wideインターフェイスを区別していない
memento objectのコストが高い場合もある

example

class Originator {
    func createMemento() -> NarrowMementoProtocol {
        let m = Memento()
        // m.state = self.state
        return m
    }

    func setMemento(memento: NarrowMementoProtocol) {
        guard let m = memento as? NarrowMementoProtocol else { return }
        // self.state = m.state
    }
}

class CareTaker {
    private var mementos: [NarrowMementoProtocol]

    func do() {
        let originator = Originator()
        let memento = originator.createMemento()
        mementos.append(memento)
        // originator.doSomething
    }

    func undo() {
        let originator = Originator()
        let memento = mementos.last // TODO: nil care
        originator.setMemento(memento)
        // originator.undoSomething
    }
}

protocol NarrowMementoProtocol { // empty protocol }

class Memento: NarrowMementoProtocol {
    var state: State
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0