API(互換性のないインターフェース)同士を適合させるためのパターンです。既存のコードの変更をせずに、再利用することで新しい機能を提供するというものです。再利用するコードには変更を加えないというのが特徴です。
主にコードを再利用するためという後天的理由から成り立っているパターンです。(設計段階でラッパーを用意するパターンはBridgeパターンです。)
##TargetClass
API(インターフェース)の定義をします。
TargetClassに適合させる既存のAPIを提供します。
AdapteeClassのAPIをTargetClassから利用できるように変換します。
既存のクラスにラッピングする形で実装するため、既存のコードを修正する必要がありません。
要は既存APIの変更がクライアント側の変更に影響しないということです。
APIを適合させる際にAPIのアクセスを制限することができます。
既存の実績あるクラスを再利用したい時など。
<?php
class ShowData {
private $data;
public function __construct($data)
{
$this->data = $data;
}
public function showOriginalData()
{
echo $this->data;
}
public function showProcessedData()
{
echo $this->data . 'How are you?';
}
}
<?php
interface ShowSourceData {
public function show();
}
<?php
require_once 'ShowSourceData.php';
require_once 'ShowData.php';
class ShowSourceDataImpl extends ShowData implements ShowSourceData {
public function __construct($data)
{
parent::__construct($data);
}
public function show()
{
parent::showProcessedData();
}
}
<?php
require_once 'ShowSourceDataImpl.php';
$show_data = new ShowSourceDataImpl('Hello! Mr. Data.');
$show_data->show();
ラッパー部分が異なるだけで、クライアント側コードは同じです。
委譲とは、具体的な処理を別のクラスに任せるという意味です。
DIのような・・といっては語弊があるでしょうか・・・(゜-゜)
<?php
require_once '../ShowSourceData.php';
require_once '../ShowData.php';
class ShowSourceDataImpl implements ShowSourceData {
private $show_data;
public function __construct($data)
{
$this->show_data = new ShowData($data);
}
public function show()
{
$this->show_data->showProcessedData();
}
}