1. 定义
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。2. UML 类图
3. 结构代码
// Facade pattern -- Structural example
|
using System;
namespace DoFactory.GangOfFour.Facade.Structural { /// <summary> /// MainApp startup class for Structural /// Facade Design Pattern. /// </summary> class MainApp { /// <summary> /// Entry point into console application. /// </summary> public static void Main() { Facade facade = new Facade();
facade.MethodA(); facade.MethodB();
// Wait for user Console.ReadKey(); } }
/// <summary> /// The 'Subsystem ClassA' class /// </summary> class SubSystemOne { public void MethodOne() { Console.WriteLine(" SubSystemOne Method"); } }
/// <summary> /// The 'Subsystem ClassB' class /// </summary> class SubSystemTwo { public void MethodTwo() { Console.WriteLine(" SubSystemTwo Method"); } }
/// <summary> /// The 'Subsystem ClassC' class /// </summary> class SubSystemThree { public void MethodThree() { Console.WriteLine(" SubSystemThree Method"); } }
/// <summary> /// The 'Subsystem ClassD' class /// </summary> class SubSystemFour { public void MethodFour() { Console.WriteLine(" SubSystemFour Method"); } }
/// <summary> /// The 'Facade' class /// </summary> class Facade { private SubSystemOne _one; private SubSystemTwo _two; private SubSystemThree _three; private SubSystemFour _four;
public Facade() { _one = new SubSystemOne(); _two = new SubSystemTwo(); _three = new SubSystemThree(); _four = new SubSystemFour(); }
public void MethodA() { Console.WriteLine("\nMethodA() ---- "); _one.MethodOne(); _two.MethodTwo(); _four.MethodFour(); }
public void MethodB() { Console.WriteLine("\nMethodB() ---- "); _two.MethodTwo(); _three.MethodThree(); } } } |
Output
MethodA() ----
SubSystemOne Method SubSystemTwo Method SubSystemFour Method MethodB() ---- SubSystemTwo Method SubSystemThree Method |
4. 实例代码
// Facade pattern -- Real World example
|
using System;
namespace DoFactory.GangOfFour.Facade.RealWorld { /// <summary> /// MainApp startup class for Real-World /// Facade Design Pattern. /// </summary> class MainApp { /// <summary> /// Entry point into console application. /// </summary> 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("\n" + customer.Name + " has been " + (eligible ? "Approved" : "Rejected"));
// Wait for user Console.ReadKey(); } }
/// <summary> /// The 'Subsystem ClassA' class /// </summary> class Bank { public bool HasSufficientSavings(Customer c, int amount) { Console.WriteLine("Check bank for " + c.Name); return true; } }
/// <summary> /// The 'Subsystem ClassB' class /// </summary> class Credit { public bool HasGoodCredit(Customer c) { Console.WriteLine("Check credit for " + c.Name); return true; } }
/// <summary> /// The 'Subsystem ClassC' class /// </summary> class Loan { public bool HasNoBadLoans(Customer c) { Console.WriteLine("Check loans for " + c.Name); return true; } }
/// <summary> /// Customer class /// </summary> class Customer { private string _name;
// Constructor public Customer(string name) { this._name = name; }
// Gets the name public string Name { get { return _name; } } }
/// <summary> /// The 'Facade' class /// </summary> 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; } } } |
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 |
该文章来自:http://www.dofactory.com/Patterns/PatternFacade.aspx