Perlでアダプターパターン! (デザインパターン)

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

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

◆ はじめに

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

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

それは、

です。

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

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

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

◆ サイト最新情報

◆ コンテンツ

2008-02-17 Perlでアダプターパターン! (デザインパターン)

Perlでデザインパターン 第2弾(アダプターパターン)

まず、オブジェクト指向の基礎とアダプターパターンついては、以下のリンクを参照してください。

また、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();

◆ おすすめ 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

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