The before code shows OrderService calling payment and inventory services directly, creating tight coupling. The after code introduces an EventBus where OrderService publishes an 'order_created' event. PaymentService and InventoryService subscribe to this event and react independently, decoupling the components and enabling asynchronous processing.
### Before: tightly coupled synchronous calls
class OrderService:
def create_order(self, order):
payment_service.process_payment(order)
inventory_service.update_stock(order)
### After: event-driven design with event bus
class EventBus:
def __init__(self):
self.listeners = {}
def subscribe(self, event_type, listener):
self.listeners.setdefault(event_type, []).append(listener)
def publish(self, event_type, data):
for listener in self.listeners.get(event_type, []):
listener(data)
class OrderService:
def __init__(self, event_bus):
self.event_bus = event_bus
def create_order(self, order):
# Save order logic here
self.event_bus.publish('order_created', order)
class PaymentService:
def __init__(self, event_bus):
event_bus.subscribe('order_created', self.process_payment)
def process_payment(self, order):
# Payment processing logic
pass
class InventoryService:
def __init__(self, event_bus):
event_bus.subscribe('order_created', self.update_stock)
def update_stock(self, order):
# Stock update logic
pass
# Usage
bus = EventBus()
payment_service = PaymentService(bus)
inventory_service = InventoryService(bus)
order_service = OrderService(bus)
order_service.create_order({'id': 123, 'items': ['book', 'pen']})