@blog.justoneplanet.info

日々勉強

PHPでデザインパターン:Adapter(アダプタ)

メリットは「既存のコードを再利用出来ること」である。

■コード

以下の様なクラスがあるとする。

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

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment