PerlでBridgeパターン! (デザインパターン)

Perl初心者のためのPerlノートです!

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

◆ はじめに

本ページは、私がPerlを習得した時(いや習得中)のノートです。

ごく普通の言語(COBOL,C,Java,VB等)を知っている人が、Perlをやり始めるといろいろと悩むことがあります。

それは、

です。

本ページは、そのようなハードルを一つ一つクリアにしていけたらと思います。

そして、本ページが何かのお役に立てれば幸いです。では、ごゆっくりご覧ください。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

◆ サイト最新情報

◆ コンテンツ

2008-03-16 PerlでBridgeパターン! (デザインパターン)

Perlでデザインパターン 第9弾(Bridgeパターン)

尚、諸事情により、第8弾のAbstractFactoryバターンは、パスします。(あとでできたらいいなぁ)


では、Bridgeパターンとは、機能のクラス階層と実装のクラス階層を橋渡し(Bridge)するパターンです。

機能のクラス階層とは、親クラスでの足りない機能を子クラスが付け足していくようなクラス階層です。

実装のクラス階層とは、親クラスでの抽象的なものを子クラスが具象的にしていくようなクラス階層です。


以下では、AbastractionクラスとRefinedAbastractionクラスが機能のクラス階層になっています。

そして、ImplementorクラスとConreteImplementorクラスが、実装のクラス階層になっています。

また、これはTemplateパターンにもなっていますね。


一般的なBuilderパターンのクラス図
     +---------------------+             +---------------------+  
     |  Abastraction       |o----------->|  Implementor        |  
     +---------------------+             +---------------------+  
     |  Impl               |             |                     |  
     +---------------------+             +---------------------+  
     |  method1            |             |  ImplMethodX        |  
     |  method2            |             |  ImplMethodY        |  
     |  method3            |             |                     |  
     +---------------------+             +---------------------+  
                #                                   #             
                |                                   |             
                |                                   |             
                |                                   |             
     +----------+----------+             +----------+----------+  
     | RefinedAbastraction |             | ConreteImplementor  |  
     +---------------------+             +---------------------+  
     |                     |             |                     |  
     +---------------------+             +---------------------+  
     | refinedMethodA      |             | ImplMethodX         |  
     | refinedMethodB      |             | ImplMethodY         |  
     +---------------------+             +---------------------+  
サンプル

一番下で紹介している本の『Java言語で学ぶデザインパターン入門』に書かれているBridgeパターンのJavaでのサンプルをPerlで書き換えてみました。



サンプルのクラス図
     +---------------------+             +---------------------+  
     |  Display            |o----------->|  DisplayImpl        |  
     +---------------------+             +---------------------+  
     |  Impl               |             |                     |  
     +---------------------+             +---------------------+  
     |  open               |             |  rawOpen            |  
     |  print              |             |  rawPrint           |  
     |  close              |             |  rawClose           |  
     |  display            |             |                     |  
     +---------------------+             +---------------------+  
                #                                   #             
                |                                   |             
                |                                   |             
                |                                   |             
     +----------+----------+             +----------+----------+  
     | CountDisplay        |             | ConreteImplementor  |  
     +---------------------+             +---------------------+  
     |                     |             |                     |  
     +---------------------+             +---------------------+  
     | multDisplay         |             | rawOpen             |  
     |                     |             | rawPrint            |  
     |                     |             | rawClose            |  
     +---------------------+             +---------------------+  
Display.pm
package Display;
use strict;
use warnings;

sub new {
    my $class = shift;
    my $self = {};
    $self->{impl} = shift;
    return bless $self, $class;
}
sub open {
    my $self = shift;
    $self->{impl}->rawOpen;
}
sub print {
    my $self = shift;
    $self->{impl}->rawPrint;
}
sub close {
    my $self = shift;
    $self->{impl}->rawClose;
}
sub display {
    my $self = shift;
    $self->open;
    $self->print;
    $self->close;
}
1;

CountDisplay.pm
package CountDisplay;
use strict;
use warnings;
use base 'Display';

sub multidisplay {
    my $self = shift;
    my $times = shift;
    $self->open;
    for my $i (0..$times-1) {
        $self->print;
    }
    $self->close;
}
1;

DisplayImpl.pm
package DisplayImpl;
use strict;
use warnings;

sub rawOpen { die "オーバーライド必須"; }
sub rawPrint { die "オーバーライド必須"; }
sub rawClose { die "オーバーライド必須"; }
1;

StringDisplayImpl.pm
package StringDisplayImpl;
use strict;
use warnings;
#use base 'DisplayImpl';

sub new {
    my $class = shift;
    my $self = {};
    $self->{string} = shift;
    $self->{width} = length($self->{string});
    return bless $self, $class;
}
sub rawOpen {
    my $self = shift;
    $self->printLine;
}
sub rawPrint {
    my $self = shift;
    print "|$self->{string}|\n";
}
sub rawClose {
    my $self = shift;
    $self->printLine;
}
sub printLine {
    my $self = shift;
    print "+";
    for my $i (0..$self->{width}-1) {
        print '-';
    }
    print "+\n";
}
1;

Main.pl
use strict;
use warnings;
use Display;
use CountDisplay;
use StringDisplayImpl;

my $d1 = Display->new(StringDisplayImpl->new("Hello, Japan."));
my $d2 = Display->new(StringDisplayImpl->new("Hello, World."));
my $d3 = CountDisplay->new(StringDisplayImpl->new("Hello, Universe."));

$d1->display();
$d2->display();
$d3->display();
$d3->multidisplay(5);

実行結果
C:\Documents and Settings\dp\Bridge>perl Main.pl
+-------------+
|Hello, Japan.|
+-------------+
+-------------+
|Hello, World.|
+-------------+
+----------------+
|Hello, Universe.|
+----------------+
+----------------+
|Hello, Universe.|
|Hello, Universe.|
|Hello, Universe.|
|Hello, Universe.|
|Hello, Universe.|
+----------------+

尚、本コンテンツは、結城先生の以下の本をかなり参考にしています。

Javaでデザインパターンを勉強したい人には、お勧めのご著書です!

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

◆ おすすめ Perl本

■ 続・初めてのPerl 改訂版

『初めてのPerl』の次ぎに読むと吉です。

結構いいですが・・・、初心者にはちょっと難しいかもです。

■ 結城浩のPerlクイズ

この本には、ちゃいちゃんパパの小話しが載っています(謎)。

ある程度、Perlを理解している人には、たまらない内容になっています。さすが結城先生だな!

結城浩のPerlクイズ

■ 新版Perl言語プログラミングレッスン入門編

実は、私はまだ読んでいませんが、結城先生の本なので良くないはずがありません。

新版Perl言語プログラミングレッスン入門編

■ CGI&Perlポケットリファレンス (Pocket reference)

この本は、非常に役に立ちます。ちょっと調べるのに最適です。サンプルも説明も的を射ています。

CGI&Perlポケットリファレンス (Pocket reference)

■ Perlベストプラクティス

一読の価値有りだと思います。

Perlベストプラクティス

■ プログラミングPerl〈VOLUME1〉

ご存知、Perl本の聖書、ラクダ本(上)です。

■ プログラミングPerl〈VOLUME2〉

ご存知、Perl本の聖書、ラクダ本(下)です。

◆ おわりに

最後に、本ページが、何かのお役に立てれば幸いです。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

人のよいところをどんどん見つけよう