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.