Design Patterns
Example 1: Mortgage Application System

Imagine a simplified mortgage application system where different subsystems handle credit checks, document verification, and approval processes. We can create a Facade to simplify the process for clients:


// Subsystem classes
class CreditChecker
{
    public bool CheckCredit(string customerId)
    {
        // Simulated credit check logic
        Console.WriteLine($"Credit check for customer {customerId} passed.");
        return true;
    }
}

class DocumentVerifier
{
    public bool VerifyDocuments(string customerId)
    {
        // Simulated document verification logic
        Console.WriteLine($"Documents for customer {customerId} verified.");
        return true;
    }
}

class ApprovalProcess
{
    public void ProcessApproval(string customerId)
    {
        // Simulated approval process
        Console.WriteLine($"Loan approved for customer {customerId}.");
    }
}

// Facade class
class MortgageApplicationFacade
{
    private CreditChecker creditChecker;
    private DocumentVerifier documentVerifier;
    private ApprovalProcess approvalProcess;

    public MortgageApplicationFacade()
    {
        creditChecker = new CreditChecker();
        documentVerifier = new DocumentVerifier();
        approvalProcess = new ApprovalProcess();
    }

    public void ApplyForMortgage(string customerId)
    {
        Console.WriteLine($"Applying for mortgage for customer {customerId}:");

        if (creditChecker.CheckCredit(customerId) && documentVerifier.VerifyDocuments(customerId))
        {
            approvalProcess.ProcessApproval(customerId);
        }
        else
        {
            Console.WriteLine($"Mortgage application for customer {customerId} declined.");
        }
    }
}

// Client code
class Program
{
    static void Main(string[] args)
    {
        MortgageApplicationFacade mortgageFacade = new MortgageApplicationFacade();

        // Client applies for mortgage
        mortgageFacade.ApplyForMortgage("1234567890");
    }
}