PHPで学ぶデザインパターン Advent Calendar 2018で間に合わなかった記事。
元となるクラスに修正を加えることなくインターフェースを変更することができるパターン。
異なるインターフェース間の互換性を調整するようなAdapterクラスを用意することで実現する。
<?php
interface Bird
{
public function fly();
}
class SmallBird implements Bird
{
public function fly()
{
echo 'fly short time';
}
}
class BigBird implements Bird
{
public function fly()
{
echo 'fly long time';
}
}
class Human
{
public function eat(Bird $bird)
{
echo 'Yummy!';
}
}
class MiddleBird
{
public function jump()
{
echo 'jump like flying';
}
}
// Adapter
class MiddleBirdAdapter implements Bird
{
private $middleBird;
public function __construct(MiddleBird $middleBird)
{
$this->middleBird = $middleBird;
}
// MiddleBirdのメソッドをラップする
public function fly()
{
$this->middleBird->jump();
}
}
$human = new Human();
$smallBird = new SmallBird();
$human->eat($smallBird); // Yummy
$middleBird = new MiddleBird();
$middleBirdAdapter = new MiddleBirdAdapter($middleBird);
$human->eat($middleBirdAdapter); // Yummy
インターフェースに定義されたメソッドで振る舞いをラップするメソッドをつくる感じ。
使い所を慎重に考える必要がありそう。