Adapterパターンとは?
adapterとは「適合させる」という意味を持ち、既存のクラスのままではそのまま使えない場合などに、ターゲットの既存クラスをラッピングし、使える形に変える変換器のようなクラスのことを指します。別名でWrapperパターンとも言われます。
現実世界で例えるとこんな感じ。コンセントからPCに電気を供給するには、ACアダプタが必要です。なぜ必要かというと、コンセントから供給されている交流電圧ではPCは動かない為です。PCなどの一般機器は直接電圧である必要があります。コンセントから受け取った電圧を交流から直流に変換する為に、ACアダプタが必要とされています。
今回のパターンでは、二つの対象物をつなぐ役割をするインターフェースを実装することになります。
このパターンのなにがいい?
影響範囲が大きい未知数の既存クラスを改修(主に追加機能開発など)する際に、効果をもたらします。改修対象となるクラスに新規でインターフェースを実装し、そのインターフェースを実装したクラスを作成します。そのクラスを使用することにより、既存クラスを触ることなく必要な改修を行えるので、既存クラスの呼び出し先の影響範囲を考慮する必要がなくなり、テストケースが減ります。つまり、より安全に改修が可能になります。
クラス設計
今回は二つの対象物をつなぐためのインターフェースを作るだけになります。作成方法としては以下2パターンがあります。
- 委譲するパターン
- 継承するパターン
そもそも「委譲」と「継承」とは?
「継承」はなんとなくイメージできる人も多いと思いますが、「委譲」はどうでしょうか?
委譲
「委譲」は他者に権限や権利をゆだねるという意味で、英語では「delegate」といいます。
プログラムの世界では、クラスの一部の機能の実装を他のクラスに任せることを「委譲」といいます。
継承と委譲の違い
既存クラスの機能をどこまで使うかというのがポイントになるようです。
「継承」では、親クラスの全ての機能を子クラスが引き継ぎます。
「委譲」では、親クラスの一部を子クラスが引き継ぎます。
サンプルプログラム(継承を利用したパターン)
Adaptee
class Banner
{
private $string;
public function __construct($string)
{
$this->string = $string;
}
public function showWithParen()
{
echo "(" . $this->string . ")";
}
public function showWithAster()
{
echo "*" . $this->string . "*";
}
}
Target
interface Print
{
public function printWeak();
public function printStrong();
}
Adapter
class PrintBanner extends Banner implements Print
{
public function __construct($string)
{
parent::__construct($string);
}
public function printWeak()
{
$this->showWithParen();
}
public function printStrong()
{
$this->showWithAster();
}
}
Client
class Main
{
public function main()
{
$ob = new PrintBanner ("hoge");
$ob->outputWeak();
$ob->outputStrong();
}
}
コメント