Stateパターン
Strategyパターンの双子であるところのStateパターンをPerlでやってみた。
本で読んだだけだとピンと来なかったけど、実際に手で書いてみると確かにやっていることは同じだった。
https://github.com/rightgo09/perl-headfirst-designpattern/tree/master/state
振る舞いをカプセル化して、処理を委譲し、そしてそれは交換可能である。
HeadFirstの本では
Stateパターンは、コンテキスト内で多数の条件文を使うことに対する代替手段だと考えましょう。振舞いを状態オブジェクト内にカプセル化することにより、コンテキスト内の状態オブジェクトを変更するだけでその振舞いを変更できます。
(P.411)
とある。なるほど。
テストで使ったコード
use strict; use warnings; use GumballMachine; my $gumball_machine = GumballMachine->new(5); print $gumball_machine->to_s, "\n"; $gumball_machine->insert_quarter; $gumball_machine->turn_crank; print $gumball_machine->to_s, "\n"; $gumball_machine->insert_quarter; $gumball_machine->turn_crank; $gumball_machine->insert_quarter; $gumball_machine->turn_crank; print $gumball_machine->to_s, "\n";
Mighty Gumball, Inc. Perl対応据付型ガムボール モデル#2013 在庫:5個のガムボール このマシンは25セントが投入されるのを待っています 25セントを投入しました クランクを回しました…… ガムボールがスロットから転がり出てきます…… Mighty Gumball, Inc. Perl対応据付型ガムボール モデル#2013 在庫:4個のガムボール このマシンは25セントが投入されるのを待っています 25セントを投入しました クランクを回しました…… 当たりです! 25セントで2つのガムボールがもらえます ガムボールがスロットから転がり出てきます…… ガムボールがスロットから転がり出てきます…… 25セントを投入しました クランクを回しました…… ガムボールがスロットから転がり出てきます…… Mighty Gumball, Inc. Perl対応据付型ガムボール モデル#2013 在庫:1個のガムボール このマシンは25セントが投入されるのを待っています
1/10の確率でガムが2個もらえるのだけれど、
「25セント入れる」→「クランクを回す」
という操作自体は何も変わらない。
「1/10の確率」という条件が介在している分だけStateパターンっぽいということなのだろうか。