using System; namespace DoFactory.GangOfFour.Facade.RealWorld { ////// MainApp startup class for Real-World /// Facade Design Pattern. /// class MainApp { ////// Entry point into console application. /// static void Main() { // Facade Mortgage mortgage = new Mortgage(); // Evaluate mortgage eligibility for customer Customer customer = new Customer("Ann McKinsey"); bool eligible = mortgage.IsEligible(customer, 125000); Console.WriteLine(customer.Name+"has been"+(eligible?"Approved":"Rejected")); // Wait for user Console.ReadKey(); } } ////// The 'Subsystem ClassA' class /// class Bank { public bool HasSufficientSavings(Customer c, int amount) { Console.WriteLine("Check bank for " + c.Name); return true; } } ////// The 'Subsystem ClassB' class /// class Credit { public bool HasGoodCredit(Customer c) { Console.WriteLine("Check credit for " + c.Name); return true; } } ////// The 'Subsystem ClassC' class /// class Loan { public bool HasNoBadLoans(Customer c) { Console.WriteLine("Check loans for " + c.Name); return true; } } ////// Customer class /// class Customer { private string _name; // Constructor public Customer(string name) { this._name = name; } // Gets the name public string Name { get { return _name; } } } ////// The 'Facade' class /// class Mortgage { private Bank _bank = new Bank(); private Loan _loan = new Loan(); private Credit _credit = new Credit(); public bool IsEligible(Customer cust, int amount) { Console.WriteLine("{0} applies for {1:C} loan\n", cust.Name, amount); bool eligible = true; // Check creditworthyness of applicant if (!_bank.HasSufficientSavings(cust, amount)) { eligible = false; } else if (!_loan.HasNoBadLoans(cust)) { eligible = false; } else if (!_credit.HasGoodCredit(cust)) { eligible = false; } return eligible; } } }