読者です 読者をやめる 読者になる 読者になる

理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

Adapterパターン

perl design pattern

ところで、前回ぼくが書いたプログラムは参考文献の生き写しなんですけど、
著作権的にグレーな気がします。うん、希望的観測でもグレーなんだ。
そういうわけなので、生き写しでない感じのプログラムを載せることにしました。
考える力もこの機会につけるよ!!!!


今回のはAdapterパターンて書いてあるけど、ラッパーの方が馴染み深い気がしました。
なんか既にある機能を、ほしい形に(使いやすい形に)したい!!てときに使う。てか使わざるを得ないパターンぽい。
Web上でAPIが公開されているときに、各言語で簡単に使える形にしたいとかそんな感じ。
たいそうな名前がついてますがJavaのIntegerとかもこれで、ぜんぜん特別なことはない。
ていうかデザインパターン自体ノウハウだし、特別なことはないんだろうなー。


まずこんなクラスが提供されているとする。
Plus.pm

package Plus;

sub new {
    my ($class, $num) = @_;
    bless \$num, $class;
}

sub plus {
    my $self = shift;
    $$self += shift;
}

1;

なんて高機能なクラスなんだと、みなさんびっくりされていることでしょう。足し算ができるクラスだ!!
残念ですけどこんな高機能なクラスの内部は触れません。でも、その足し算の内容を出力しないといけないという仕様が決められています。
その仕様を実現するメソッドの名前はprint_additionという。
PlusString.pm

package PlusString;
sub print_addition {}
1;

Plus.pmを触らずにこの機能を実現します。
Adapterパターンには継承を使うパターンと委譲を使うパターンとがあるんですけど、今回は委譲を使う。

package Stringfy;
use interface qw(PlusString);
use Plus;

sub new {
    bless { plus => Plus->new( $_[1] ) }, $_[0];
}

sub print_addition {
    my ($self, $num) = @_;
    print "${ $self->{plus} } + $num = ", $self->{plus}->plus( $num ), "\n";
}

1;

テストプログラム。

use Stringfy;

my $s = Stringfy->new( 10 );
$s->print_addition( 5 );
$s->print_addition( 3 );

実行結果

10 + 5 = 15
15 + 3 = 18

やったよ!!


Plus.pmは足し算で、足し算できるクラスなんてあんまし意味ないですけど、これはぼくの発想力が貧困なせいですね。
結局、Adapterパターンは誰でも自然に使うよな、でFA。