Статья
Шаблон проектирования "Адаптер"

Шаблон проектирования "Адаптер"

25 апреля 2020

Относится к структурным шаблонам.

Плюсы:
- преобразует один интерфейс в другой (обеспечивает совместимость несовместимых интерфейсов, реализуя прослойку).


Пример на PHP

Пусть имеется интерфейс Cat и 2 класса кошек - британская кошка BritishShorthairCat и персидская кошка PersianCat, реализующие интерфейс Cat:

interface Cat
{
    public function meow();
}

class BritishShorthairCat implements Cat
{
    public function meow()
    {
    }
}

class PersianCat implements Cat
{
    public function meow()
    {
    }
}

Создадим новый класс - дикая кошка WildCat, у которой отсутствует метод meow, но присутствует метод snort:

class WildCat
{
    public function snort()
    {
    }
}

Создадим "адаптер" между дикой кошкой (не реализующей интерфейс Cat) и всеми кошками, реализующими интерфейс Cat:

class WildCatAdapter implements Cat
{
    private WildCat $cat;

    public function __construct(WildCat $cat)
    {
        $this->cat = $cat;
    }

    public function meow()
    {
        $this->cat->snort();
    }
}

$wildCat = new WildCat();
$wildCatAdapter = new WildCatAdapter($wildCat); // Реализует интерфейс Cat

$britishCat = new BritishShorthairCat();
$persianCat = new PersianCat();

Пример на Go
 

package main

type ICat interface {
   Meow()
}

type BritishShorthairCat struct {
}

func (c *BritishShorthairCat) Meow() {
}

type PersianCat struct {
}

func (c *PersianCat) Meow() {
}

type WildCat struct {
}

func (c *WildCat) Snort() {
}

type WildCatAdapter struct {
   cat WildCat
}

func (c *WildCatAdapter) Meow() {
   c.cat.Snort()
}

func main() {
   britCat := BritishShorthairCat{}
   britCat.Meow()

   percCat := PersianCat{}
   percCat.Meow()

   wildCat := WildCat{}
   adapter := WildCatAdapter{cat: wildCat}
   adapter.Meow()
}



Источники:
http://designpatternsphp.readthedocs.io/ru/latest/Structural/Adapter/README.html
https://habrahabr.ru/company/mailru/blog/325492/