今回はStateパターンについて書いていきます。
デザインパターンとは
デザインパターンとはソフトウェア開発の設計方法の事です。
『オブジェクト指向における再利用のためのデザインパターン』という本が出典で、全部で23種類のパターンが紹介されています。
Stateパターンとは
Stateパターンとは複数の状態を簡単に扱えるデザインパターンです。
状態に応じて処理を変更したり条件によって状態を切り替える処理をcontrollerに書いたりすると非常に煩雑になります。
Stateパターンでは、その処理をState
とStateContext
に移す事で呼び出し元をすっきりとさせる事ができます。
SwiftでのStateパターンの実装方法
Stateパターンの実装例は下の通りです。
Walking
とRunning
という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
は直接変更しません。
User
のstate
の切り替えも全てそれぞれのState
内で記述しています。
上の例では、Runnning
状態で3回move
を呼び出すと自動でWalking
に切り替わるようになります。
状態の管理という煩雑な処理をメソッド呼び出し側から削除できるのはかなり嬉しいですね。
ただし"ユーザーによってmove
を5回呼び出すと切り替える"という柔軟な仕様には不向きかもしれません。
- 作者: エリックガンマ,ラルフジョンソン,リチャードヘルム,ジョンブリシディース,Erich Gamma,Ralph Johnson,Richard Helm,John Vlissides,本位田真一,吉田和樹
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 1999/10
- メディア: 単行本
- 購入: 21人 クリック: 711回
- この商品を含むブログ (210件) を見る