Шаблон проектирования "Адаптер"
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/