Facade

The Facade pattern is a structural design pattern that provides a simplified interface to a complex subsystem. It acts as a unified entry point that hides the complexity of multiple classes, libraries, or APIs behind a single, easy-to-use interface.

The primary purpose of the Facade pattern is to make a complex system easier to use by providing a higher-level interface that shields clients from the intricate details of the underlying subsystem. Instead of requiring clients to interact with multiple classes and understand their relationships, the facade presents a streamlined interface that handles the complexity internally.

Problem it Solves

When working with complex libraries or subsystems, clients often need to:

  • Understand multiple classes and their interactions
  • Make numerous method calls in a specific sequence
  • Handle various configuration details
  • Deal with dependencies between different components

This complexity can make the code difficult to maintain, test, and understand. The Facade pattern addresses these issues by encapsulating the complexity and providing a simpler interface.

Structure and Components

Client → Facade → Subsystem Classes

The pattern consists of three main components:

  • Facade: The main class that provides a simplified interface to the subsystem. It knows which subsystem classes are responsible for a request and delegates client requests to appropriate subsystem objects.
  • Subsystem Classes: These are the existing classes that implement the actual functionality. They handle work assigned by the facade object but have no knowledge of the facade’s existence.
  • Client: The code that uses the facade instead of calling subsystem objects directly.

Benefits

  • Simplified Interface: Clients work with a single, intuitive interface rather than multiple complex classes.
  • Loose Coupling: The facade reduces dependencies between clients and subsystem classes, making the system more maintainable.
  • Layered Architecture: It helps organize code into layers, with the facade serving as an abstraction layer.
  • Easier Testing: Mock objects can be created for the facade rather than for multiple subsystem classes.

When to Use

The Facade pattern is particularly useful when:

  • You need to provide a simple interface to a complex subsystem
  • There are many dependencies between clients and implementation classes
  • You want to layer your subsystems
  • You need to wrap a poorly designed collection of APIs with a single well-designed API

Implementation Considerations

When implementing the Facade pattern, consider:

  • The facade should not add unnecessary functionality, only simplify access
  • Multiple facades can be created for different client needs
  • The facade doesn’t prevent clients from accessing subsystem classes directly if needed
  • Keep the facade focused on coordination rather than business logic

Real-World Applications

Common examples include:

  • Database access layers that hide SQL complexity
  • API wrappers that simplify third-party service integration
  • Gaming engines that provide simple interfaces to complex graphics and physics systems
  • Web frameworks that abstract HTTP request/response handling

Basic Example Explanation

This example demonstrates a notification system that uses the Facade pattern to simplify email sending operations. The system consists of several complex subsystem classes:

from typing import List, Optional
from datetime import datetime

# Subsystem Classes - Complex components that do the actual work
class EmailService:
    """Handles email sending functionality"""
    
    def __init__(self) -> None:
        self.smtp_server = "smtp.example.com"
        self.port = 587
        self.is_connected = False
    
    def connect(self) -> bool:
        """Establish connection to email server"""
        print(f"Connecting to {self.smtp_server}:{self.port}")
        self.is_connected = True
        return True
    
    def authenticate(self, username: str, password: str) -> bool:
        """Authenticate with email server"""
        print(f"Authenticating user: {username}")
        return True
    
    def send_email(self, to: str, subject: str, body: str) -> bool:
        """Send email message"""
        if not self.is_connected:
            raise Exception("Not connected to email server")
        print(f"Sending email to {to} with subject: {subject}")
        return True
    
    def disconnect(self) -> None:
        """Close connection to email server"""
        print("Disconnecting from email server")
        self.is_connected = False

class TemplateEngine:
    """Handles email template processing"""
    
    def __init__(self) -> None:
        self.templates = {
            'welcome': 'Welcome {name}! Your account has been created.',
            'notification': 'Hi {name}, you have a new notification: {message}',
            'reminder': 'Reminder: {task} is due on {date}'
        }
    
    def render_template(self, template_name: str, **kwargs) -> str:
        """Render template with provided data"""
        if template_name not in self.templates:
            raise ValueError(f"Template '{template_name}' not found")
        
        template = self.templates[template_name]
        return template.format(**kwargs)

class UserService:
    """Handles user data operations"""
    
    def __init__(self) -> None:
        # Mock user database
        self.users = {
            'john@example.com': {'name': 'John Doe', 'preferences': {'notifications': True}},
            'jane@example.com': {'name': 'Jane Smith', 'preferences': {'notifications': False}}
        }
    
    def get_user(self, email: str) -> Optional[dict]:
        """Retrieve user information"""
        return self.users.get(email)
    
    def user_wants_notifications(self, email: str) -> bool:
        """Check if user wants to receive notifications"""
        user = self.get_user(email)
        return user and user.get('preferences', {}).get('notifications', False)

class LoggingService:
    """Handles application logging"""
    
    def log_email_sent(self, to: str, subject: str, timestamp: datetime) -> None:
        """Log email sending activity"""
        print(f"LOG: Email sent to {to} at {timestamp} - Subject: {subject}")

# Facade Class - Provides simplified interface to the complex subsystem
class NotificationFacade:
    """
    Facade that simplifies the process of sending notifications.
    Hides the complexity of email service, template engine, user service, and logging.
    """
    
    def __init__(self, username: str, password: str) -> None:
        # Initialize all subsystem components
        self.email_service = EmailService()
        self.template_engine = TemplateEngine()
        self.user_service = UserService()
        self.logging_service = LoggingService()
        
        # Store credentials for email authentication
        self.username = username
        self.password = password
    
    def send_welcome_email(self, user_email: str) -> bool:
        """
        Send a welcome email to a new user.
        This method handles all the complexity internally.
        """
        try:
            # Get user information
            user = self.user_service.get_user(user_email)
            if not user:
                print(f"User {user_email} not found")
                return False
            
            # Render welcome template
            message = self.template_engine.render_template(
                'welcome', 
                name=user['name']
            )
            
            # Send email through email service
            self._send_email(user_email, "Welcome to Our Service", message)
            
            return True
            
        except Exception as e:
            print(f"Failed to send welcome email: {e}")
            return False
    
    def send_notification(self, user_email: str, notification_message: str) -> bool:
        """
        Send a notification email to a user.
        Checks user preferences before sending.
        """
        try:
            # Check if user wants notifications
            if not self.user_service.user_wants_notifications(user_email):
                print(f"User {user_email} has disabled notifications")
                return False
            
            # Get user information
            user = self.user_service.get_user(user_email)
            if not user:
                print(f"User {user_email} not found")
                return False
            
            # Render notification template
            message = self.template_engine.render_template(
                'notification',
                name=user['name'],
                message=notification_message
            )
            
            # Send email
            self._send_email(user_email, "New Notification", message)
            
            return True
            
        except Exception as e:
            print(f"Failed to send notification: {e}")
            return False
    
    def send_reminder(self, user_email: str, task: str, due_date: str) -> bool:
        """Send a reminder email to a user."""
        try:
            user = self.user_service.get_user(user_email)
            if not user:
                print(f"User {user_email} not found")
                return False
            
            # Render reminder template
            message = self.template_engine.render_template(
                'reminder',
                name=user['name'],
                task=task,
                date=due_date
            )
            
            # Send email
            self._send_email(user_email, "Task Reminder", message)
            
            return True
            
        except Exception as e:
            print(f"Failed to send reminder: {e}")
            return False
    
    def _send_email(self, to: str, subject: str, body: str) -> None:
        """
        Private method that handles the email sending process.
        This encapsulates the complexity of email service operations.
        """
        # Connect to email server
        self.email_service.connect()
        
        # Authenticate
        self.email_service.authenticate(self.username, self.password)
        
        # Send email
        self.email_service.send_email(to, subject, body)
        
        # Log the activity
        self.logging_service.log_email_sent(to, subject, datetime.now())
        
        # Disconnect
        self.email_service.disconnect()


# Client Code - Uses the facade instead of dealing with subsystem complexity
def main():
    """
    Client code that uses the facade.
    Notice how simple and clean the client code is - it doesn't need to know
    about the complexity of email services, templates, user management, etc.
    """
    
    # Create the facade with email credentials
    notification_system = NotificationFacade("admin@example.com", "password123")
    
    # Send welcome email - single method call handles all complexity
    print("=== Sending Welcome Email ===")
    notification_system.send_welcome_email("john@example.com")
    
    print("\n=== Sending Notification ===")
    notification_system.send_notification("john@example.com", "Your profile has been updated")
    
    print("\n=== Sending Reminder ===")
    notification_system.send_reminder("john@example.com", "Complete project review", "2024-12-15")
    
    print("\n=== Trying to send notification to user who disabled notifications ===")
    notification_system.send_notification("jane@example.com", "This won't be sent")

if __name__ == "__main__":
    main()
  • EmailService: Handles SMTP connection, authentication, and email sending
  • TemplateEngine: Processes email templates with dynamic data
  • UserService: Manages user data and preferences
  • LoggingService: Records email activity

The NotificationFacade class provides a simplified interface that hides all this complexity. Instead of requiring clients to understand how to coordinate these four different services, the facade offers simple methods like send_welcome_email() and send_notification().

from typing import Dict, List, Optional, Tuple
from dataclasses import dataclass
from enum import Enum
from datetime import datetime, timedelta
import json

# Enums for type safety
class PaymentStatus(Enum):
    PENDING = "pending"
    PROCESSING = "processing"
    COMPLETED = "completed"
    FAILED = "failed"

class OrderStatus(Enum):
    CREATED = "created"
    CONFIRMED = "confirmed"
    SHIPPED = "shipped"
    DELIVERED = "delivered"
    CANCELLED = "cancelled"

# Data classes for structured data
@dataclass
class Product:
    id: str
    name: str
    price: float
    stock: int

@dataclass
class Customer:
    id: str
    name: str
    email: str
    address: str
    loyalty_points: int

@dataclass
class OrderItem:
    product: Product
    quantity: int
    price: float

@dataclass
class Order:
    id: str
    customer: Customer
    items: List[OrderItem]
    total: float
    status: OrderStatus
    created_at: datetime

# Complex Subsystem Classes
class InventoryService:
    """Manages product inventory and stock levels"""
    
    def __init__(self) -> None:
        self.products: Dict[str, Product] = {
            'laptop': Product('laptop', 'Gaming Laptop', 1200.0, 10),
            'mouse': Product('mouse', 'Wireless Mouse', 25.0, 50),
            'keyboard': Product('keyboard', 'Mechanical Keyboard', 80.0, 30)
        }
    
    def check_availability(self, product_id: str, quantity: int) -> bool:
        """Check if product is available in requested quantity"""
        product = self.products.get(product_id)
        if not product:
            return False
        return product.stock >= quantity
    
    def get_product(self, product_id: str) -> Optional[Product]:
        """Retrieve product information"""
        return self.products.get(product_id)
    
    def reserve_stock(self, product_id: str, quantity: int) -> bool:
        """Reserve stock for an order"""
        product = self.products.get(product_id)
        if not product or product.stock < quantity:
            return False
        
        product.stock -= quantity
        print(f"Reserved {quantity} units of {product.name}. Remaining stock: {product.stock}")
        return True
    
    def release_stock(self, product_id: str, quantity: int) -> None:
        """Release reserved stock back to inventory"""
        product = self.products.get(product_id)
        if product:
            product.stock += quantity
            print(f"Released {quantity} units of {product.name}. Current stock: {product.stock}")

class PaymentService:
    """Handles payment processing"""
    
    def __init__(self) -> None:
        self.transactions: Dict[str, dict] = {}
    
    def process_payment(self, order_id: str, amount: float, payment_method: str) -> Tuple[bool, str]:
        """Process payment for an order"""
        transaction_id = f"txn_{order_id}_{datetime.now().strftime('%Y%m%d%H%M%S')}"
        
        # Simulate payment processing
        if payment_method == "credit_card" and amount > 0:
            self.transactions[transaction_id] = {
                'order_id': order_id,
                'amount': amount,
                'status': PaymentStatus.COMPLETED.value,
                'method': payment_method,
                'timestamp': datetime.now()
            }
            print(f"Payment processed successfully: {transaction_id}")
            return True, transaction_id
        else:
            print(f"Payment failed for order {order_id}")
            return False, ""
    
    def refund_payment(self, transaction_id: str) -> bool:
        """Refund a payment"""
        if transaction_id in self.transactions:
            self.transactions[transaction_id]['status'] = 'refunded'
            print(f"Payment refunded: {transaction_id}")
            return True
        return False

class CustomerService:
    """Manages customer data and operations"""
    
    def __init__(self) -> None:
        self.customers: Dict[str, Customer] = {
            'cust1': Customer('cust1', 'John Doe', 'john@example.com', '123 Main St', 100),
            'cust2': Customer('cust2', 'Jane Smith', 'jane@example.com', '456 Oak Ave', 250)
        }
    
    def get_customer(self, customer_id: str) -> Optional[Customer]:
        """Retrieve customer information"""
        return self.customers.get(customer_id)
    
    def update_loyalty_points(self, customer_id: str, points: int) -> bool:
        """Update customer loyalty points"""
        customer = self.customers.get(customer_id)
        if customer:
            customer.loyalty_points += points
            print(f"Updated loyalty points for {customer.name}: {customer.loyalty_points}")
            return True
        return False
    
    def validate_customer(self, customer_id: str) -> bool:
        """Validate customer exists and is active"""
        return customer_id in self.customers

class ShippingService:
    """Handles order shipping and delivery"""
    
    def __init__(self) -> None:
        self.shipments: Dict[str, dict] = {}
    
    def calculate_shipping_cost(self, customer: Customer, total_weight: float) -> float:
        """Calculate shipping cost based on customer location and weight"""
        base_cost = 10.0
        weight_cost = total_weight * 2.0
        return base_cost + weight_cost
    
    def schedule_shipment(self, order_id: str, customer: Customer) -> Tuple[bool, str]:
        """Schedule shipment for an order"""
        tracking_id = f"ship_{order_id}_{datetime.now().strftime('%Y%m%d')}"
        
        self.shipments[tracking_id] = {
            'order_id': order_id,
            'customer_address': customer.address,
            'status': 'scheduled',
            'estimated_delivery': datetime.now() + timedelta(days=3)
        }
        
        print(f"Shipment scheduled: {tracking_id}")
        return True, tracking_id
    
    def track_shipment(self, tracking_id: str) -> Optional[dict]:
        """Get shipment tracking information"""
        return self.shipments.get(tracking_id)

class OrderRepository:
    """Manages order data persistence"""
    
    def __init__(self) -> None:
        self.orders: Dict[str, Order] = {}
    
    def save_order(self, order: Order) -> bool:
        """Save order to database"""
        self.orders[order.id] = order
        print(f"Order saved: {order.id}")
        return True
    
    def get_order(self, order_id: str) -> Optional[Order]:
        """Retrieve order by ID"""
        return self.orders.get(order_id)
    
    def update_order_status(self, order_id: str, status: OrderStatus) -> bool:
        """Update order status"""
        order = self.orders.get(order_id)
        if order:
            order.status = status
            print(f"Order {order_id} status updated to: {status.value}")
            return True
        return False

class NotificationService:
    """Handles customer notifications"""
    
    def send_order_confirmation(self, customer: Customer, order: Order) -> bool:
        """Send order confirmation email"""
        print(f"Sending order confirmation to {customer.email} for order {order.id}")
        return True
    
    def send_shipping_notification(self, customer: Customer, tracking_id: str) -> bool:
        """Send shipping notification"""
        print(f"Sending shipping notification to {customer.email} - Tracking: {tracking_id}")
        return True

# Main Facade Class
class EcommerceFacade:
    """
    Facade that provides a simplified interface for e-commerce operations.
    Coordinates multiple subsystems to handle complex business workflows.
    """
    
    def __init__(self) -> None:
        # Initialize all subsystem services
        self.inventory_service = InventoryService()
        self.payment_service = PaymentService()
        self.customer_service = CustomerService()
        self.shipping_service = ShippingService()
        self.order_repository = OrderRepository()
        self.notification_service = NotificationService()
    
    def place_order(self, customer_id: str, items: List[Tuple[str, int]], 
                   payment_method: str) -> Tuple[bool, str]:
        """
        Place a complete order - handles all the complexity of order processing.
        
        Args:
            customer_id: ID of the customer
            items: List of (product_id, quantity) tuples
            payment_method: Payment method to use
            
        Returns:
            Tuple of (success, order_id or error_message)
        """
        try:
            # Step 1: Validate customer
            customer = self.customer_service.get_customer(customer_id)
            if not customer:
                return False, "Customer not found"
            
            # Step 2: Validate and prepare order items
            order_items = []
            total_amount = 0.0
            
            for product_id, quantity in items:
                # Check product availability
                if not self.inventory_service.check_availability(product_id, quantity):
                    return False, f"Product {product_id} not available in requested quantity"
                
                # Get product details
                product = self.inventory_service.get_product(product_id)
                if not product:
                    return False, f"Product {product_id} not found"
                
                # Create order item
                item_price = product.price * quantity
                order_item = OrderItem(product, quantity, item_price)
                order_items.append(order_item)
                total_amount += item_price
            
            # Step 3: Reserve inventory
            for product_id, quantity in items:
                if not self.inventory_service.reserve_stock(product_id, quantity):
                    # Rollback previous reservations
                    self._rollback_inventory(items[:items.index((product_id, quantity))])
                    return False, f"Failed to reserve stock for {product_id}"
            
            # Step 4: Create order
            order_id = f"order_{datetime.now().strftime('%Y%m%d%H%M%S')}"
            order = Order(
                id=order_id,
                customer=customer,
                items=order_items,
                total=total_amount,
                status=OrderStatus.CREATED,
                created_at=datetime.now()
            )
            
            # Step 5: Process payment
            payment_success, transaction_id = self.payment_service.process_payment(
                order_id, total_amount, payment_method
            )
            
            if not payment_success:
                # Rollback inventory
                self._rollback_inventory(items)
                return False, "Payment processing failed"
            
            # Step 6: Save order
            self.order_repository.save_order(order)
            self.order_repository.update_order_status(order_id, OrderStatus.CONFIRMED)
            
            # Step 7: Update customer loyalty points
            loyalty_points = int(total_amount / 10)  # 1 point per $10 spent
            self.customer_service.update_loyalty_points(customer_id, loyalty_points)
            
            # Step 8: Send confirmation notification
            self.notification_service.send_order_confirmation(customer, order)
            
            return True, order_id
            
        except Exception as e:
            # Rollback any changes in case of error
            self._rollback_inventory(items)
            return False, f"Order processing failed: {str(e)}"
    
    def ship_order(self, order_id: str) -> Tuple[bool, str]:
        """
        Ship an order - handles all shipping-related operations.
        
        Returns:
            Tuple of (success, tracking_id or error_message)
        """
        try:
            # Get order details
            order = self.order_repository.get_order(order_id)
            if not order:
                return False, "Order not found"
            
            if order.status != OrderStatus.CONFIRMED:
                return False, f"Order cannot be shipped. Current status: {order.status.value}"
            
            # Schedule shipment
            success, tracking_id = self.shipping_service.schedule_shipment(order_id, order.customer)
            
            if not success:
                return False, "Failed to schedule shipment"
            
            # Update order status
            self.order_repository.update_order_status(order_id, OrderStatus.SHIPPED)
            
            # Send shipping notification
            self.notification_service.send_shipping_notification(order.customer, tracking_id)
            
            return True, tracking_id
            
        except Exception as e:
            return False, f"Shipping failed: {str(e)}"
    
    def cancel_order(self, order_id: str) -> Tuple[bool, str]:
        """
        Cancel an order - handles refunds and inventory restoration.
        
        Returns:
            Tuple of (success, message)
        """
        try:
            # Get order details
            order = self.order_repository.get_order(order_id)
            if not order:
                return False, "Order not found"
            
            if order.status in [OrderStatus.SHIPPED, OrderStatus.DELIVERED]:
                return False, f"Order cannot be cancelled. Current status: {order.status.value}"
            
            # Restore inventory
            for item in order.items:
                self.inventory_service.release_stock(item.product.id, item.quantity)
            
            # Process refund (simplified - assume we have transaction ID)
            # In real implementation, you'd store transaction ID with the order
            
            # Update order status
            self.order_repository.update_order_status(order_id, OrderStatus.CANCELLED)
            
            return True, "Order cancelled successfully"
            
        except Exception as e:
            return False, f"Cancellation failed: {str(e)}"
    
    def get_order_status(self, order_id: str) -> Optional[Dict[str, str]]:
        """Get comprehensive order status information"""
        order = self.order_repository.get_order(order_id)
        if not order:
            return None
        
        return {
            'order_id': order.id,
            'status': order.status.value,
            'customer': order.customer.name,
            'total': f"${order.total:.2f}",
            'items_count': len(order.items),
            'created_at': order.created_at.strftime('%Y-%m-%d %H:%M:%S')
        }
    
    def _rollback_inventory(self, items: List[Tuple[str, int]]) -> None:
        """Helper method to rollback inventory reservations"""
        for product_id, quantity in items:
            self.inventory_service.release_stock(product_id, quantity)

# Client Code - Demonstrates the simplified interface
def main():
    """
    Client code demonstrating the facade's simplified interface.
    Notice how complex e-commerce operations are reduced to simple method calls.
    """
    
    # Create the e-commerce facade
    store = EcommerceFacade()
    
    print("=== E-commerce Facade Demo ===\n")
    
    # Place an order - single method call handles all complexity
    print("1. Placing an order...")
    success, result = store.place_order(
        customer_id='cust1',
        items=[('laptop', 1), ('mouse', 2)],
        payment_method='credit_card'
    )
    
    if success:
        order_id = result
        print(f"✓ Order placed successfully: {order_id}\n")
        
        # Check order status
        print("2. Checking order status...")
        status = store.get_order_status(order_id)
        if status:
            print("Order Status:")
            for key, value in status.items():
                print(f"  {key.replace('_', ' ').title()}: {value}")
        print()
        
        # Ship the order
        print("3. Shipping the order...")
        ship_success, tracking = store.ship_order(order_id)
        if ship_success:
            print(f"✓ Order shipped successfully. Tracking ID: {tracking}\n")
        else:
            print(f"✗ Shipping failed: {tracking}\n")
        
        # Check final status
        print("4. Final order status...")
        final_status = store.get_order_status(order_id)
        if final_status:
            print(f"Final Status: {final_status['status']}\n")
        
    else:
        print(f"✗ Order failed: {result}\n")
    
    # Demonstrate order cancellation
    print("5. Attempting to place and cancel another order...")
    success2, result2 = store.place_order(
        customer_id='cust2',
        items=[('keyboard', 1)],
        payment_method='credit_card'
    )
    
    if success2:
        order_id2 = result2
        print(f"✓ Second order placed: {order_id2}")
        
        # Cancel the order
        cancel_success, cancel_msg = store.cancel_order(order_id2)
        if cancel_success:
            print(f"✓ Order cancelled: {cancel_msg}")
        else:
            print(f"✗ Cancellation failed: {cancel_msg}")
    
    # Show error handling
    print("\n6. Demonstrating error handling...")
    error_success, error_msg = store.place_order(
        customer_id='invalid_customer',
        items=[('laptop', 1)],
        payment_method='credit_card'
    )
    print(f"Expected error: {error_msg}")

if __name__ == "__main__":
    main()

Key Benefits Demonstrated:

  • Simplified Client Code: The main function shows how easy it is to use the system
  • Hidden Complexity: Clients don’t need to know about SMTP connections, template rendering, or user preferences
  • Error Handling: The facade handles exceptions and provides meaningful feedback
  • Coordination: The facade manages the proper sequence of operations across subsystems

Without the facade, clients would need to manually handle email connections, template rendering, user lookups, logging, and error handling for each operation.## Advanced Example Explanation

This advanced example demonstrates the Facade pattern in a complex e-commerce system. The system involves multiple subsystems working together to handle order processing, inventory management, payments, shipping, and customer notifications.

Subsystem Classes:

  • InventoryService: Manages product stock and availability
  • PaymentService: Processes payments and refunds
  • CustomerService: Handles customer data and loyalty points
  • ShippingService: Manages order shipping and tracking
  • OrderRepository: Persists order data
  • NotificationService: Sends customer notifications

The EcommerceFacade provides three main operations:

  • place_order(): Orchestrates the entire order placement process including validation, inventory reservation, payment processing, and notifications
  • ship_order(): Handles shipping operations and status updates
  • cancel_order(): Manages order cancellation with proper rollback procedures

Key Advanced Features:

  • Error Handling and Rollback: The facade implements proper error handling with rollback mechanisms. If any step fails during order processing, it automatically reverses previous operations (like releasing reserved inventory).
  • Transaction Coordination: The facade coordinates multiple subsystems in the correct sequence, ensuring data consistency across all operations.
  • Type Safety: Uses type hints, enums, and dataclasses for better code quality and IDE support.
  • Business Logic Encapsulation: Complex business rules (like loyalty point calculations) are handled within the facade, keeping the client code simple.
  • Comprehensive State Management: The facade manages order states and ensures proper transitions between different order statuses.

This example shows how the Facade pattern can significantly simplify complex business operations while maintaining proper error handling and data consistency across multiple subsystems.

Track your progress

Mark this subtopic as completed when you finish reading.