メリットは「既存のコードを再利用出来ること」である。
■コード
以下の様なクラスがあるとする。
class SoccerPlayer { private $_name; public function __construct($name) { $this->_name = $name; } public function introduce() { print($this->_name); } }
以下の様なインターフェイスがあり、メソッドを「getName」で統一したい。
interface Person { public function getName(); }
更に、使用実績があるSoccerPlayerクラスのコードを変更することなく、「getName」でSoccerPlayerクラスのメソッド「introduce」をcallしたい。そんな要望に応えるのがAdapterパターンだ。
継承の場合
継承の場合はコンストラクタの引数は「$name」であり、内部に保持するのも「$name」である。
class SoccerPerson extends SoccerPlayer implements Person { public function __construct($name) { parent::__construct($name); } public function getName() { parent::introduce(); } }
クライアント側
継承を使用しているので、当然ながら元のメソッド「introduce」も使えてしまう。
$john = new SoccerPerson('John'); $john->getName();//John $john->introduce();//John
委譲の場合
継承の場合はコンストラクタの引数は「$name」であり、内部に保持するのは「SoccerPlayerのインスタンス」である。従ってgetNameした時、そのインスタンス経由でintroduceがコールできる。
class SoccerPerson implements Person { private $_person; public function __construct($name) { $this->_person = new SoccerPlayer($name); } public function getName() { $this->_person->introduce(); } }
クライアント側
委譲(継承ではない)を使用しているので、メソッド「introduce」は使えない。
$john = new SoccerPerson('John'); $john->getName();//John $john->introduce();//Fatal error