Patrones de diseño de Python: adaptador
El patrón de adaptador funciona como un puente entre dos interfaces incompatibles. Este tipo de patrón de diseño viene bajo patrón estructural ya que este patrón combina la capacidad de dos interfaces independientes.
Este patrón involucra una sola clase, que se encarga de unir funcionalidades de interfaces independientes o incompatibles. Un ejemplo de la vida real podría ser el caso de un lector de tarjetas, que actúa como adaptador entre la tarjeta de memoria y una computadora portátil. Conecta la tarjeta de memoria en el lector de tarjetas y el lector de tarjetas en la computadora portátil para que la tarjeta de memoria se pueda leer a través de la computadora portátil.
El patrón de diseño del adaptador ayuda a que las clases trabajen juntas. Convierte la interfaz de una clase en otra interfaz según los requisitos. El patrón incluye una especiación, un polimorfismo que nombra un nombre y múltiples formas. Digamos por una clase de forma que se pueda usar según los requisitos reunidos.
Hay dos tipos de patrones de adaptadores:
Patrón de adaptador de objeto
Este patrón de diseño se basa en la implementación de objetos. Por lo tanto, se denomina Patrón de adaptador de objeto.
Patrón de adaptador de clase
Esta es una forma alternativa de implementar el patrón de diseño del adaptador. El patrón se puede implementar usando múltiples herencias.
¿Cómo implementar el patrón de adaptador?
Veamos ahora cómo implementar el patrón de adaptador.
class EuropeanSocketInterface:
def voltage(self): pass
def live(self): pass
def neutral(self): pass
def earth(self): pass
# Adaptee
class Socket(EuropeanSocketInterface):
def voltage(self):
return 230
def live(self):
return 1
def neutral(self):
return -1
def earth(self):
return 0
# Target interface
class USASocketInterface:
def voltage(self): pass
def live(self): pass
def neutral(self): pass
# The Adapter
class Adapter(USASocketInterface):
__socket = None
def __init__(self, socket):
self.__socket = socket
def voltage(self):
return 110
def live(self):
return self.__socket.live()
def neutral(self):
return self.__socket.neutral()
# Client
class ElectricKettle:
__power = None
def __init__(self, power):
self.__power = power
def boil(self):
if self.__power.voltage() > 110:
print "Kettle on fire!"
else:
if self.__power.live() == 1 and \
self.__power.neutral() == -1:
print "Coffee time!"
else:
print "No power."
def main():
# Plug in
socket = Socket()
adapter = Adapter(socket)
kettle = ElectricKettle(adapter)
# Make coffee
kettle.boil()
return 0
if __name__ == "__main__":
main()
Salida
El programa anterior genera la siguiente salida:
Explicación
El código incluye una interfaz de adaptador con varios parámetros y atributos. Incluye Adaptee junto con la interfaz de Target que implementa todos los atributos y muestra la salida como visible.