// Facade pattern -- Real World example  using System;// "SubSystem ClassA"class Bank
{
  // Methods
  public bool SufficientSavings( Customer c )
  {
    Console.WriteLine("Check bank for {0}", c.Name );
    return true;
  }
}// "SubSystem ClassB"class Credit
{
  // Methods
  public bool GoodCredit( int amount, Customer c )
  {
    Console.WriteLine( "Check credit for {0}", c.Name );
    return true;
  }
}// "SubSystem ClassC"class Loan
{
  // Methods
  public bool GoodLoan( Customer c )
  {
    Console.WriteLine( "Check loan for {0}", c.Name );
    return true;
  }
}class Customer
{
  // Fields
  private string name;  // Constructors
  public Customer( string name )
  {
    this.name = name;
  }  // Properties
  public string Name
  {
    get{ return name; }
  }
}// "Facade"class MortgageApplication
{
  // Fields
  int amount;
  private Bank bank = new Bank();
  private Loan loan = new Loan();
  private Credit credit = new Credit();  // Constructors
  public MortgageApplication( int amount )
  {
    this.amount = amount;
  }  // Methods
  public bool IsEligible( Customer c )
  {
    // Check creditworthyness of applicant
    if( !bank.SufficientSavings( c ) )  
      return false;
    if( !loan.GoodLoan( c ) )  
      return false;
    if( !credit.GoodCredit( amount, c ))  
      return false;    return true;
  }
}
/// <summary>
/// Facade Client
/// </summary>
public class FacadeApp
{
  public static void Main(string[] args)
  {
    // Create Facade
    MortgageApplication mortgage =
                new MortgageApplication( 125000 );
    // Call subsystem through Facade
    mortgage.IsEligible(
             new Customer( "Gabrielle McKinsey" ) );  }
}  Output  
Check bank for Gabrielle McKinsey
Check loan for Gabrielle McKinsey
Check credit for Gabrielle McKinsey
Facade只是对Business的一次包装?但例子中Facade实现的功能完全可以在Business中实现啊。
Thx

解决方案 »

  1.   

    有时候UI层发操作并不涉及业务逻辑的时候,无必要经过业务逻辑层获取数据
    当BLL层的越发庞大的时候,就需要FACADE去WRAP一 下。
    FACADE来自法文,意思是建筑物的立面
      

  2.   

    名称 Facade 意图为子系统中的一组接口提供一个一致的界面,F a c a d e 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 适用性 当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。F a c a d e 可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过f a c a d e 层。 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入f a c a d e 将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。 当你需要构建一个层次结构的子系统时,使用f a c a d e 模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过f a c a d e 进行通讯,从而简化了它们之间的依赖关系。 
     
      

  3.   

    赞同upto(阿球) 
    了解过DIP(依赖倒置原则)
    高层模块不应该依赖于低层模块,两都都应该依赖于抽象。
     
      

  4.   

    DIP(依赖倒置原则):
    抽象不应该依赖于细节。细节应该依赖于抽象。不懂,还望说明