🔌
PHPでデザインパターン「Adapter」
目次
概要
Adapterパターンは外部のAPIなどの異なるAPIを適合させるアダプターとなるパターンです。
もし外部のAPIでバージョンアップなどが行われた際も呼び出し側のコードを修正することなく、アダプターとなるクラスを修正するだけで対応可能になります。
実装
<?php
// 外部API
class UserModel
{
public function __construct(
public ?int $id,
public ?string $name,
public ?int $age,
) {}
public static function find(int $id): UserModel
{
// 仮データ
return new UserModel($id, "太郎", 19);
}
public static function create(string $name, int $age): UserModel
{
// 仮データ
return new UserModel(1, $name, $age);
}
}
<?php
interface UserRepository
{
public function findUser(int $id): UserModel;
public function createUser(string $name, int $age): UserModel;
}
// アダプターになるクラス
class UserRepositoryImpl implements UserRepository
{
public function findUser(int $id): UserModel
{
return UserModel::find($id);
}
public function createUser(string $name, int $age): UserModel
{
return UserModel::create($name, $age);
}
}
<?php
use PHPUnit\Framework\TestCase;
// テストコード
class UserRepositoryTest extends TestCase
{
public function test_find_user(): void
{
$repository = new UserRepositoryImpl();
$user = $repository->findUser(1);
$this->assertSame(1, $user->id);
$this->assertSame("太郎", $user->name);
$this->assertSame(19, $user->age);
}
public function test_create_user(): void
{
$repository = new UserRepositoryImpl();
$user = $repository->createUser("花子", 21);
$this->assertSame(1, $user->id);
$this->assertSame("花子", $user->name);
$this->assertSame(21, $user->age);
}
}
資料
参考文献『PHPによるデザインパターン入門』https://shimooka.hateblo.jp/entry/20100301/1267436385
Discussion