Monday, 6 July 2015

Façade defines

Definition

Provide a unified interface to a set of interfaces in a subsystem. Façade defines a higher-level interface that makes the subsystem easier to use.

Frequency of use:
High





UML class diagram







Participants


    The classes and objects participating in this pattern are:
  • Facade   (MortgageApplication)
    • knows which subsystem classes are responsible for a request.
    • delegates client requests to appropriate subsystem objects.
  • Subsystem classes   (Bank, Credit, Loan)
    • implement subsystem functionality.
    • handle work assigned by the Facade object.
    • have no knowledge of the facade and keep no reference to it.



Structural code in C#


This structural code demonstrates the Facade pattern which provides a simplified and uniform interface to a large subsystem of classes.
  1. using System;

  2. namespace DoFactory.GangOfFour.Facade.Structural
  3. {
  4.   /// <summary>
  5.   /// MainApp startup class for Structural
  6.   /// Facade Design Pattern.
  7.   /// </summary>
  8.   class MainApp
  9.   {
  10.     /// <summary>
  11.     /// Entry point into console application.
  12.     /// </summary>
  13.     public static void Main()
  14.     {
  15.       Facade facade = new Facade();

  16.       facade.MethodA();
  17.       facade.MethodB();

  18.       // Wait for user
  19.       Console.ReadKey();
  20.     }
  21.   }

  22.   /// <summary>
  23.   /// The 'Subsystem ClassA' class
  24.   /// </summary>
  25.   class SubSystemOne
  26.   {
  27.     public void MethodOne()
  28.     {
  29.       Console.WriteLine(" SubSystemOne Method");
  30.     }
  31.   }

  32.   /// <summary>
  33.   /// The 'Subsystem ClassB' class
  34.   /// </summary>
  35.   class SubSystemTwo
  36.   {
  37.     public void MethodTwo()
  38.     {
  39.       Console.WriteLine(" SubSystemTwo Method");
  40.     }
  41.   }

  42.   /// <summary>
  43.   /// The 'Subsystem ClassC' class
  44.   /// </summary>
  45.   class SubSystemThree
  46.   {
  47.     public void MethodThree()
  48.     {
  49.       Console.WriteLine(" SubSystemThree Method");
  50.     }
  51.   }

  52.   /// <summary>
  53.   /// The 'Subsystem ClassD' class
  54.   /// </summary>
  55.   class SubSystemFour
  56.   {
  57.     public void MethodFour()
  58.     {
  59.       Console.WriteLine(" SubSystemFour Method");
  60.     }
  61.   }

  62.   /// <summary>
  63.   /// The 'Facade' class
  64.   /// </summary>
  65.   class Facade
  66.   {
  67.     private SubSystemOne _one;
  68.     private SubSystemTwo _two;
  69.     private SubSystemThree _three;
  70.     private SubSystemFour _four;

  71.     public Facade()
  72.     {
  73.       _one = new SubSystemOne();
  74.       _two = new SubSystemTwo();
  75.       _three = new SubSystemThree();
  76.       _four = new SubSystemFour();
  77.     }

  78.     public void MethodA()
  79.     {
  80.       Console.WriteLine("\nMethodA() ---- ");
  81.       _one.MethodOne();
  82.       _two.MethodTwo();
  83.       _four.MethodFour();
  84.     }

  85.     public void MethodB()
  86.     {
  87.       Console.WriteLine("\nMethodB() ---- ");
  88.       _two.MethodTwo();
  89.       _three.MethodThree();
  90.     }
  91.   }
  92. }
  93.  

Output
MethodA() ----
SubSystemOne Method
SubSystemTwo Method
SubSystemFour Method

MethodB() ----
SubSystemTwo Method
SubSystemThree Method





Real-world code in C#


This real-world code demonstrates the Facade pattern as a MortgageApplication object which provides a simplified interface to a large subsystem of classes measuring the creditworthyness of an applicant.
  1. using System;

  2. namespace DoFactory.GangOfFour.Facade.RealWorld
  3. {
  4.   /// <summary>
  5.   /// MainApp startup class for Real-World
  6.   /// Facade Design Pattern.
  7.   /// </summary>
  8.   class MainApp
  9.   {
  10.     /// <summary>
  11.     /// Entry point into console application.
  12.     /// </summary>
  13.     static void Main()
  14.     {
  15.       // Facade
  16.       Mortgage mortgage = new Mortgage();

  17.       // Evaluate mortgage eligibility for customer
  18.       Customer customer = new Customer("Ann McKinsey");
  19.       bool eligible = mortgage.IsEligible(customer, 125000);

  20.       Console.WriteLine("\n" + customer.Name +
  21.           " has been " + (eligible ? "Approved" : "Rejected"));

  22.       // Wait for user
  23.       Console.ReadKey();
  24.     }
  25.   }

  26.   /// <summary>
  27.   /// The 'Subsystem ClassA' class
  28.   /// </summary>
  29.   class Bank
  30.   {
  31.     public bool HasSufficientSavings(Customer c, int amount)
  32.     {
  33.       Console.WriteLine("Check bank for " + c.Name);
  34.       return true;
  35.     }
  36.   }

  37.   /// <summary>
  38.   /// The 'Subsystem ClassB' class
  39.   /// </summary>
  40.   class Credit
  41.   {
  42.     public bool HasGoodCredit(Customer c)
  43.     {
  44.       Console.WriteLine("Check credit for " + c.Name);
  45.       return true;
  46.     }
  47.   }

  48.   /// <summary>
  49.   /// The 'Subsystem ClassC' class
  50.   /// </summary>
  51.   class Loan
  52.   {
  53.     public bool HasNoBadLoans(Customer c)
  54.     {
  55.       Console.WriteLine("Check loans for " + c.Name);
  56.       return true;
  57.     }
  58.   }

  59.   /// <summary>
  60.   /// Customer class
  61.   /// </summary>
  62.   class Customer
  63.   {
  64.     private string _name;

  65.     // Constructor
  66.     public Customer(string name)
  67.     {
  68.       this._name = name;
  69.     }

  70.     // Gets the name
  71.     public string Name
  72.     {
  73.       get { return _name; }
  74.     }
  75.   }

  76.   /// <summary>
  77.   /// The 'Facade' class
  78.   /// </summary>
  79.   class Mortgage
  80.   {
  81.     private Bank _bank = new Bank();
  82.     private Loan _loan = new Loan();
  83.     private Credit _credit = new Credit();

  84.     public bool IsEligible(Customer cust, int amount)
  85.     {
  86.       Console.WriteLine("{0} applies for {1:C} loan\n",
  87.         cust.Name, amount);

  88.       bool eligible = true;

  89.       // Check creditworthyness of applicant
  90.       if (!_bank.HasSufficientSavings(cust, amount))
  91.       {
  92.         eligible = false;
  93.       }
  94.       else if (!_loan.HasNoBadLoans(cust))
  95.       {
  96.         eligible = false;
  97.       }
  98.       else if (!_credit.HasGoodCredit(cust))
  99.       {
  100.         eligible = false;
  101.       }

  102.       return eligible;
  103.     }
  104.   }
  105. }
  106.  
  107.  

Output
Ann McKinsey applies for $125,000.00 loan

Check bank for Ann McKinsey
Check loans for Ann McKinsey
Check credit for Ann McKinsey

Ann McKinsey has been Approved

No comments:

Post a Comment