Perlでテンプレートメソッドパターン! (デザインパターン)
Perlでデザインパターン 第3弾(テンプレートメソッドパターン)
テンプレートメソッドパターンとは、スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を定めるようなデザインパターンです。
以下のクラス図で示されているようにAbstractClassのtemplateMethodでアルゴリズムを記述し、ConcreteClassのmethod1等で具体的内容を記述する。
ちなにみ、AbstractClassは抽象(アブストラクト)クラスで、ConcreteClassは具象(コンクリート)クラスといいます。
一般的なテンプレートメソッドパターンのクラス図
+---------------------+ | AbstractClass | +---------------------+ | | +---------------------+ | method1 | | method2 | | templateMethod | | | +---------------------+ # | |継承 | +----------+----------+ | ConcreteClass | +---------------------+ | | +---------------------+ | method1 | | method2 | | | | | +---------------------+
サンプル
以下は、テンプレートメソッドパターンを利用した、文字や文字列を五回繰り返して表示するサンプルです。
まず、スーパークラスAbstractDisplayでAbstractメソッド(open、print、close)を使ってtemplateMethodであるdisplayで、アルゴリズムを定義します。
つぎに、サブクラスのCharDisplayとStringDisplayでそのAbstractメソッドを各々オーバライドします。
サンプルのクラス図
+---------------------+ | AbstractDisplay | +---------------------+ | | +---------------------+ | open | | print | | close | | display | +---------------------+ # | +------------------+-------------------+ | | +----------+----------+ +----------+----------+ | CharDisplay | | StringDisplay | +---------------------+ +---------------------+ | | | | +---------------------+ +---------------------+ | open | | open | | print | | print | | close | | close | | | | printLine | +---------------------+ +---------------------+
AbstractDisplay.pm
package AbstractDisplay; use strict; sub open { die "オーバーライド必須"; } sub print { die "オーバーライド必須"; } sub close { die "オーバーライド必須"; } sub display { my $self = shift; $self->open; for (my $i = 0; $i < 5; $i++) { $self->print; } $self->close; } 1;
CharDisplay.pm
package CharDisplay; use strict; use base 'AbstractDisplay'; sub new { my $class = shift; my $self = {}; $self->{ch} = shift; return bless $self, $class; } sub open { my $self = shift; print "<<"; } sub print { my $self = shift; print "$self->{ch}"; } sub close { my $self = shift; print ">>\n"; } 1;
StringDisplay.pm
package StringDisplay; use strict; use base 'AbstractDisplay'; sub new { my $class = shift; my $self = {}; $self->{string} = shift; $self->{width} = length($self->{string}); return bless $self, $class; } sub open { my $self = shift; $self->printLine; } sub print { my $self = shift; print "|$self->{string}|\n"; } sub close { my $self = shift; $self->printLine; } sub printLine { my $self = shift; print "+"; for (my $i = 0; $i < $self->{width}; $i++) { print "-"; } print "+\n"; } 1;
Main.pl
use strict; use CharDisplay; use StringDisplay; my $d1 = CharDisplay->new('H'); my $d2 = StringDisplay->new('Hello, World.'); my $d3 = StringDisplay->new('こんにちは。'); $d1->display; $d2->display; $d3->display;
Main.plの実行結果
C:\Documents and Settings\TemplateMethod>perl main.pl <<HHHHH>> +-------------+ |Hello, World.| |Hello, World.| |Hello, World.| |Hello, World.| |Hello, World.| +-------------+ +------------+ |こんにちは。| |こんにちは。| |こんにちは。| |こんにちは。| |こんにちは。| +------------+
尚、本コンテンツは、結城先生の以下の本をかなり参考にしています。
Javaでデザインパターンを勉強したい人には、お勧めのご著書です!
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/06/19
- メディア: 大型本
- 購入: 51人 クリック: 762回
- この商品を含むブログ (400件) を見る