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件) を見る