The before code shows a Car class tightly coupled to a specific Engine class, making it hard to replace the engine. The after code introduces an Adapter that wraps an OldEngine with a start() method, allowing Car to use any engine with a start() method. This organizes class relationships to reduce coupling and increase flexibility.
### Before: Tight coupling without structural pattern
class Engine:
def start(self):
print("Engine started")
class Car:
def __init__(self):
self.engine = Engine() # Direct dependency
def drive(self):
self.engine.start()
print("Car is driving")
car = Car()
car.drive()
### After: Using Adapter pattern to decouple
class OldEngine:
def ignite(self):
print("Old engine ignited")
class EngineAdapter:
def __init__(self, old_engine):
self.old_engine = old_engine
def start(self):
self.old_engine.ignite() # Adapting interface
class Car:
def __init__(self, engine):
self.engine = engine
def drive(self):
self.engine.start()
print("Car is driving")
old_engine = OldEngine()
adapted_engine = EngineAdapter(old_engine)
car = Car(adapted_engine)
car.drive()