Wzorce projektowe w Pythonie - adapter

Wzorzec adaptera działa jako pomost między dwoma niekompatybilnymi interfejsami. Ten typ wzorca projektowego wchodzi w zakres wzorca strukturalnego, ponieważ ten wzorzec łączy w sobie możliwości dwóch niezależnych interfejsów.

Ten wzorzec dotyczy pojedynczej klasy, która jest odpowiedzialna za łączenie funkcjonalności niezależnych lub niekompatybilnych interfejsów. Przykładem z życia może być czytnik kart, który działa jako przejściówka między kartą pamięci a laptopem. Kartę pamięci wkładasz do czytnika kart, a czytnik kart do laptopa, aby można było odczytać kartę pamięci przez laptopa.

Wzorzec projektowy adaptera pomaga we wspólnej pracy klas. Konwertuje interfejs klasy na inny interfejs na podstawie wymagań. Wzorzec zawiera specjację, czyli polimorfizm, który nazywa jedno imię i wiele form. Powiedz o klasie kształtu, której można używać zgodnie z zebranymi wymaganiami.

Istnieją dwa rodzaje wzorów adapterów -

Wzorzec adaptera obiektu

Ten wzorzec projektowy opiera się na implementacji obiektu. Stąd nazywa się to wzorcem adaptera obiektu.

Wzorzec adaptera klasy

Jest to alternatywny sposób implementacji wzorca projektowego adaptera. Wzorzec można zaimplementować przy użyciu wielu dziedziczenia.

Jak zaimplementować wzorzec adaptera?

Zobaczmy teraz, jak zaimplementować wzorzec adaptera.

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()

Wynik

Powyższy program generuje następujące dane wyjściowe -

Wyjaśnienie

Kod zawiera interfejs adaptera z różnymi parametrami i atrybutami. Zawiera Adaptee wraz z interfejsem Target, który implementuje wszystkie atrybuty i wyświetla dane wyjściowe jako widoczne.