🔌

PHPでデザインパターン「Adapter」

2023/08/21に公開

目次

  1. 概要
  2. 実装
  3. 資料

概要

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
https://github.com/naoyuki42/php-design-pattern

Discussion