Loading the lesson...
In the print dialog, choose "Save as PDF" as the destination.
Adapter, Decorator, and Facade
Adapter, Decorator, FacadeClient
expects a Target interface
Adapter
implements Target
Adaptee
e.g. OldPrinter
class OldPrinter:
def old_print(self, text):
return f"Old printer: {text}"
class PrinterAdapter:
def __init__(self, old_printer):
self.old_printer = old_printer
def print(self, text):
return self.old_printer.old_print(text)
adapter = PrinterAdapter(OldPrinter())
print(adapter.print("Hello World"))SimpleCoffee
the wrapped object
Milk
adds cost + description
Sugar
wraps Milk the same way
class SimpleCoffee(Coffee):
def cost(self): return 2.0
def description(self): return "Simple coffee"
class Milk(CoffeeDecorator):
def cost(self):
return self._coffee.cost() + 0.5
def description(self):
return self._coffee.description() + ", milk"
coffee = Milk(SimpleCoffee())
print(f"{coffee.description()}: ${coffee.cost()}")
# Simple coffee, milk: $2.5Client
Facade
e.g. HomeTheaterFacade
Subsystem
DVDPlayer
Subsystem
SoundSystem
Subsystem
Projector
class HomeTheaterFacade:
def __init__(self):
self.dvd = DVDPlayer()
self.sound = SoundSystem()
self.projector = Projector()
def watch_movie(self, movie):
self.projector.on()
self.sound.on()
self.dvd.on()
self.dvd.play(movie)
theater = HomeTheaterFacade()
theater.watch_movie("The Matrix")Adapter: makes incompatible interfaces work together without modifying existing codeDecorator: adds behavior dynamically, avoiding subclass explosionFacade: hides subsystem complexity behind one simple interfaceMahmoud Abas|Part 2: Structural Design Patterns