Reading Time: 1 minutes
Adapter Design Pattern in Python
Write a Python program to implement Adapter Design Pattern.
# Example #1: Language Translator # Our client, a French-only speaking person, wishes to have a two-way conversation in French. He expects the other person to be able to speak French. # Our existing class, an English-only speaking person cannot speak French. # Our Adapter, is in the form of a translator who translates English responses to French so that our French-only speaking client can have his two-way conversation in French. # Existing Class: a.k.a. Adaptee: Incompatible interface # 1 class EnglishSpeaker: def responseToGreeting(self): return "Hello to you too!" def responseToFarewell(self): return "Goodbye my friend." # Adapter Class, which takes functionality provided by EnglishSpeaker, morphs it into functionality expected by the FrenchSpeaker. class Translator: '''Accespts an english speaker, translates his responses to French.''' _englishSpeaker = None _englishToFrenchPhrases = { "Hello to you too!": "Bonjour à vous aussi", "Goodbye my friend.": "Au revoir mon ami" } def __init__(self, englishSpeaker): self._englishSpeaker = englishSpeaker # Client: Incompatible interface # 2 class FrenchSpeaker: '''Accepts an English-To-French Speaker as argument.''' _englishToFrenchTranslator = None def __init__(self, englishToFrenchTranslator): self._englishToFrenchTranslator = englishToFrenchTranslator def exchangeGreetings(self): print("Salut!") print( self._englishToFrenchTranslator._englishToFrenchPhrases[ self._englishToFrenchTranslator._englishSpeaker.responseToGreeting() ] ) def exchangeFarewell(self): print("Au revoir!") print( self._englishToFrenchTranslator._englishToFrenchPhrases[ self._englishToFrenchTranslator._englishSpeaker.responseToFarewell() ] ) # Create an English Speaking person englishSpeaker = EnglishSpeaker() # Create a translator with popular english phrases englishToFrenchTranslator = Translator(englishSpeaker) # The French Speaking Person can now get responses in French frenchSpeaker = FrenchSpeaker(englishToFrenchTranslator) # Two-way conversation in French frenchSpeaker.exchangeGreetings() frenchSpeaker.exchangeFarewell() # OUTPUT Salut! Bonjour à vous aussi Au revoir! Au revoir mon ami
# Example #2: Square-pin to round-pin adapter # Consider two incompatible interfaces: round-pin Socket & square-pin Electric Kettle. # The Electric Kettle expects a square-pin connection for it to work. # The Adapter takes square-pin of Electric Kettle, and connects to round-pin socket. # Existing Class: a.k.a. Adaptee: Incompatible interface # 1 class Socket: _pinType = "Round" # The Adapter: acts as an interface between two incompatible interfaces class Adapter: _socket = None _pinType = "SquareToRound" def __init__(self, socket): self._socket = socket # Client: Incompatible interface # 2 class ElectricKettle: _adapter = None _pinType = "Square" def __init__(self, adapter): self._adapter = adapter def makeTea(self): if self._adapter._pinType == (self._pinType + "To" + self._adapter._socket._pinType): # "SquareToRound" == "Square" + "To" + "Round" print("Boiling water....") print("Adding ingredients...") print("Tea brewing...") print("Tea is ready!") else: print("No power. Can't function.") # Create a socket roundPinSocket = Socket() # Connect adapter and socket squareToRoundAdapter = Adapter(roundPinSocket) # Connect Kettle and socket via adapter. kettle = ElectricKettle(squareToRoundAdapter) kettle.makeTea() # OUTPUT: Boiling water.... Adding ingredients... Tea brewing... Tea is ready!