Facade Pattern

  举一个生活中的小例子,大凡开过学或者毕过业的都会体会到这样一种郁闷:你要去 n

个地方办理 n 个手续(现在大学合并后就更加麻烦,因为可能那 n 个地方都隔的比较远)。

但是实际上我们需要的就是一个最后一道手续的证明而已,对于前面的手续是怎么办的、到

什么地方去办理我们都不感兴趣。

  实际上在软件系统开发中也经常回会遇到这样的情况,可能你实现了一些接口(模块),

而这些接口(模块)都分布在几个类中(比如 A BCD):A中实现了一些接口,B

实现一些接口(或者 A代表一个独立模块,BCD代表另一些独立模块)。然后你的客户

程序员(使用你设计的开发人员)只有很少的要知道你的不同接口到底是在那个类中实现的,

绝大多数只是想简单的组合你的 AD的类的接口,他并不想知道这些接口在哪里实现的。

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.

participants

    The classes and/or 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.

 

// Facade pattern -- Real World example


using System;

namespace DoFactory.GangOfFour.Facade.RealWorld
{
  // MainApp test application

  class MainApp
  {
    static void Main ()
    {
      // Facade
      Mortgage mortgage = new Mortgage();

      // Evaluate mortgage eligibility for customer
      Customer customer = new Customer("Ann McKinsey");
      bool eligable = mortgage.IsEligible(customer,125000);
      
      Console.WriteLine("/n" + customer.Name +
          " has been " + (eligable ? "Approved" : "Rejected"));

      // Wait for user
      Console.Read();
    }
  }

  // "Subsystem ClassA"

  class Bank
  {
    public bool HasSufficientSavings(Customer c, int amount)
    {
      Console.WriteLine("Check bank for " + c.Name);
      return true;
    }
  }

  // "Subsystem ClassB"

  class Credit
  {
    public bool HasGoodCredit(Customer c)
    {
      Console.WriteLine("Check credit for " + c.Name);
      return true;
    }
  }

  // "Subsystem ClassC"

  class Loan
  {
    public bool HasNoBadLoans(Customer c)
    {
      Console.WriteLine("Check loans for " + c.Name);
      return true;
    }
  }

  class Customer
  {
    private string name;

    // Constructor
    public Customer(string name)
    {
      this.name = name;
    }

    // Property
    public string Name
    {
      get{ return name; }
    }
  }

  // "Facade"

  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

A

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值