Kanade Logoカナデ Kanade

8. ステートパターン (State)

オブジェクトの内部状態が変わる時、行動も一緒に変わるようにするステートパターンについて学びましょう。

ステートパターン (State Pattern)

自販機にコインがない時にボタンを押しても出なくて、コインがある時にボタンを押したら飲み物が出ますよね?このように「現在の状態」を表すオブジェクトを別に置いて状態を交代ながら行動を変えるのがステートパターンですね。もし-それ以外ならば(if-else)の塊をなくしてくれる魔法のようなパターンなんですよ!

(参考:状態が持つべき行動を規定します)
【状態】を規定しよう:
    〈コインを入れる〉がなければならない()
    〈引く〉がなければならない()

(参考:自販機は状態オブジェクトに仕事を任せます)
【自販機】を設計しよう:
    『現在の状態』を【状態】の空っぽに隠そう
    
    最初に作られる時()次のようにしよう:
        『私』の『現在の状態』を新しい【コインなし状態】(『私』)にしよう
        
    〈状態を変える〉を作ろう(【状態】の『新しい状態』):
        『私』の『現在の状態』を『新しい状態』にしよう
        
    〈コインを入れる〉を作ろう():
        『私』の『現在の状態』の〈コインを入れる〉()を実行しよう
        
    〈引く〉を作ろう():
        『私』の『現在の状態』の〈引く〉()を実行しよう

(参考:コインがない状態の時の行動)
【状態】に従う【コインなし状態】を設計しよう:
    『機械』を【自販機】の空っぽに隠そう
    
    最初に作られる時(【自販機】の『機械』)次のようにしよう:
        『私』の『機械』を『機械』にしよう
        
    〈コインを入れる〉を作ろう():
        「コインを入れました。」を出力しよう
        『私』の『機械』の〈状態を変える〉(新しい【コインあり状態】(『私』の『機械』))を実行しよう
        
    〈引く〉を作ろう():
        「先にコインを入れてください!」を出力しよう

(参考:コインがある時の行動)
【状態】に従う【コインあり状態】を設計しよう:
    『機械』を【自販機】の空っぽに隠そう
    
    最初に作られる時(【自販機】の『機械』)次のようにしよう:
        『私』の『機械』を『機械』にしよう
        
    〈コインを入れる〉を作ろう():
        「すでにコインがあります。」を出力しよう
        
    〈引く〉を作ろう():
        「飲み物が出ます!ガチャン!」を出力しよう
        『私』の『機械』の〈状態を変える〉(新しい【コインなし状態】(『私』の『機械』))を実行しよう

『機械1』を【自販機】の新しい【自販機】()にしよう
『機械1』の〈引く〉()を実行しよう
『機械1』の〈コインを入れる〉()を実行しよう
『機械1』の〈引く〉()を実行しよう

プレイグラウンド (Playground)

ターミナル
コードを書いて「実行」ボタンを押してください。