Perl日記

PerlとかRubyとかPHPとかPythonとか

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パターンっぽいということなのだろうか。