Адаптер — это один из структурных паттернов, из названия которого исходит его и назначения. По сути это типичный переходник для разных интерфейсов или данных.
1. Адаптер имеет интерфейс, который совместим с одним из объектов.
2. Поэтому этот объект может свободно вызывать методы адаптера.
3. Адаптер получает эти вызовы и перенаправляет их второму объекту, но уже в том формате и последовательности, которые понятны второму объекту.
Вырожденная форма адаптера — двухсторонний адаптер.
Нефизические примеры из жизни — это например система СМЭВ, которая предоставляет сервисы для получения/ обмена информацией.
Однако для работы вашего приложения со СМЭВ нужны адаптеры на вашей стороне, которые могут воспринимать данные, полученные со стороны СМЭВ, переводя их в объекты, понятные вашей системе.
Существуют адаптеры класса и адаптеры объекта.
пример адаптера на python для круглых отверстий и кольев квадратного сечения
# coding=utf-8
import math
class Hole(object):
"""
Абстрактная дырка в вашем коде
"""
def __init__(self, r):
# задаем радиус дыры
self.r = r
def put(self, obj):
# пытаемся поместить
try:
# чтобы влезло, нужно,
# чтобы радиус дырки позволял
if self.r >= obj.r:
print u'Лезет!'
else:
print u'Не лезет'
except AttributeError:
print (u'Переданный объект не умеет вычислять радиус дырки,'
u' в которую он влезет! Напишите Адаптер на python!')
class Square(object):
"""
Абстрактный квадратный кол, который позволит
закрыть абстрактную дырку в коде
"""
def __init__(self, x, h):
# зададим параметры дрына
self.x = x
self.h = h
class SquareHoleAdapter(object):
def __init__(self, sq_obj):
self.sq_obj = sq_obj
@property
def r(self):
# половина диагонали квадрата будет как раз влезать
# в дырку радиусом с полученное значение
return math.sqrt(2*(self.sq_obj.x**2))/2
h1 = Hole(5)
h2 = Hole(2)
s1 = Square(5, 7)
s2 = Square(3, 3)
sa = SquareHoleAdapter(s2)
h1.put(s1)
>>> Переданный объект не умеет вычислять радиус дырки, в которую он влезет! Напишите Адаптер на python!
h1.put(sa)
>>> Лезет!
h2.put(sa)
>>> Не лезет