しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swiftで学ぶデザインパターン8 (Stateパターン)

今回はStateパターンについて書いていきます。

デザインパターンとは

デザインパターンとはソフトウェア開発の設計方法の事です。
オブジェクト指向における再利用のためのデザインパターン』という本が出典で、全部で23種類のパターンが紹介されています。

Stateパターンとは

Stateパターンとは複数の状態を簡単に扱えるデザインパターンです。
状態に応じて処理を変更したり条件によって状態を切り替える処理をcontrollerに書いたりすると非常に煩雑になります。
Stateパターンでは、その処理をStateStateContextに移す事で呼び出し元をすっきりとさせる事ができます。

SwiftでのStateパターンの実装方法

Stateパターンの実装例は下の通りです。
WalkingRunningという2種類の状態とUserという状態の所有者が登場しました。

protocol State {
    func move(user: User)
    func speed(user: User) -> Int
}

class Walking: State {
    var moveCount = 0
    
    func move(user: User) {
        moveCount++
        if (2 <= moveCount) {
            user.state = Running()
        }
    }
    
    func speed(user: User) -> Int {
        return 3
    }
}

class Running: State {
    var moveCount = 0
    
    func move(user: User) {
        moveCount++
        if (3 <= moveCount) {
            user.state = Walking()
        }
    }
    
    func speed(user: User) -> Int {
        return 10
    }
}

class User {
    var state: State = Running()
    
    func move() {
        state.move(self)
    }
    
    func speed() -> Int {
        return state.speed(self)
    }
}

let user = User()
print(user.speed()) // → 10

user.move()
user.move()
user.move()

print(user.speed()) // → 3

user.move()
user.move()

print(user.speed()) // → 10

開発者はUserだけを使い、Stateは直接変更しません。
Userstateの切り替えも全てそれぞれのState内で記述しています。

上の例では、Runnning状態で3回moveを呼び出すと自動でWalkingに切り替わるようになります。
状態の管理という煩雑な処理をメソッド呼び出し側から削除できるのはかなり嬉しいですね。
ただし"ユーザーによってmoveを5回呼び出すと切り替える"という柔軟な仕様には不向きかもしれません。

オブジェクト指向における再利用のためのデザインパターン

オブジェクト指向における再利用のためのデザインパターン