Perlでアダプターパターン! (デザインパターン)
アダプターサンプルのクラス図
Client +-------------+ | Main | +-------------+ | | +-------------+ | | +-------------+ | | | 使用:関連 v +-------------+ +-------------+ +------------------+ | Target | | Adapter | | Adaptee | +-------------+ +-------------+ +------------------+ | |#-----------| adaptee |o---------->| | +-------------+ 継承:汎化 +-------------+ 委譲:集約 +------------------+ | request() | | request() | | specialRequest() | +-------------+ +-------------+ +------------------+
では、以下で、アダプターパターンでのJavaソースとそれをPerlでリメイクしたソースとの違いをご確認ください。
尚、Javaのソースは「オブジェクト指向 WITH JAVA:アダプターパターン」のと同じです。
アダプターサンプルのソース
ターゲットクラス(やりたいことを抽象レベルで考えたクラスです)
Target.java
public abstract class Target { public abstract void printEm(); public abstract void printStrong(); }
Target.pm
package Target; use strict; sub printEm{die "オーバーライド必須";} sub printStrong{die "オーバーライド必須";} 1;
アダプティ−クラス(やりたいことが似ている具象クラスです)
Adaptee.java
public class Adaptee { private String string; public Adaptee(String string) { this.string = string; } public void showWithParen() { System.out.println("(" + string + ")"); } public void showWithAster() { System.out.println("*" + string + "*"); } public void showWithSemicolon() { System.out.println(";" + string + ";"); } public void showWithPercent() { System.out.println("%" + string + "%"); } }
Adaptee.pm
package Adaptee; use strict; sub new { my $class = shift; my $string = shift; return bless {string => $string}, $class; } sub showWithParen { my $self = shift; print "\($self->{string}\)", "\n"; } sub showWithAster { my $self = shift; print "\*$self->{string}\*", "\n"; } sub showWithSemicolon { my $self = shift; print "\;$self->{string}\;", "\n"; } sub showWithPercent { my $self = shift; print "\%$self->{string}\%", "\n"; } 1;
アダプタークラス(ターゲットクラスとアダプティ−クラスを繋ぐ(適合)クラスです。ターゲットクラスを継承し、アダプティ−クラスを委譲します)
Adapter.java
public class Adapter extends Target { private Adaptee adaptee; public Adapter(String string) { this.adaptee = new Adaptee(string); } public void printEm() { adaptee.showWithParen(); } public void printStrong() { adaptee.showWithAster(); } }
Adapter.pm
package Adapter; use strict; use base 'Target'; use Adaptee; sub new { my $class = shift; my $string = shift; my $adaptee = Adaptee->new($string); return bless {adaptee => $adaptee}, $class; } sub printEm { my $self = shift; $self->{adaptee}->showWithParen; } sub printStrong { my $self = shift; $self->{adaptee}->showWithAster; } 1;
メインクラス
Main.java
public class Main { //client public static void main(String[] args) { Target p = new Adapter("Hello"); p.printEm(); p.printStrong(); } }
Main.pl
use strict; use Adapter; my $p = Adapter->new("Hello"); $p->printEm(); $p->printStrong();