デザインパターン

PerlでCommandパターン

Receiverクラスが実装。ReceiverクラスをCommandクラスでラップして実装をカプセル化。CommandクラスはAdapterパターン的に利用する。ContextからRecieverを分離するため、Invokerを通じてCommandオブジェクトを呼び出す。下のプログラムにはないけど、Invok…

PerlでStateパターン

StateからContextへの参照はリークを防ぐためにScalar::Util::weakenを利用する。状態マシンだから仕方がないとはいえContext〜State間のくっつき具合は気持ち悪い。状態を追加する際にContextに手を加えずに済む実装方法はないものか。 use strict; use war…

PerlでDecoratorパターン

use strict; my $component = new ConcreteComponent(); my $decorator = new ConcreteDecorator($component); $decorator->operate(); ############################## # Component { package Component; sub new{ my $this = shift; my $obj = { @_ }; ret…

PerlでObject Adapterパターン

use strict; my $adaptee = new Adaptee(); my $adapter = new Adapter($adaptee); $adapter->request(); ############################## # Adapter { package Target; sub new{ my $this = shift; return bless { @_ }, $this; } sub request{ die "need o…

PerlでStrategyパターン

ようやくリファレンスや継承に慣れてきた。 use strict; use warnings; my $strategyA = new ConcreteStrategyA(); my $strategyB = new ConcreteStrategyB(); my $context = new Context($strategyA); $context->contextInterface(); $context->setStrategy…

PerlでObserverパターン

Subjectにremoveがないこと、ConcreteObserverのコンストラクタでSubjectオブジェクトを設定しているけど、まあいいんじゃないでしょうか。 use strict; my $subject = new ConcreteSubject(); my @observers = (); for(my $i = 0; $i < 5; $i++){ my $tmp_n…