2009年11月3日星期二

Facade设计模式

Facade[f'sɑ:d],建筑物的外观的意思。在程序开发中,会有很多小的类,他们之间的关系错综复杂,如果想完成一件任务,需要了解这些类的关系和调用顺序才行。将这些错综复杂的类关系用Facade类包装起来,对外提供一个窗口,就是Facade设计模式。
比如顾客(Customer)申请房屋抵押贷款,怎样根据顾客的身份和申请贷款的金额来判断能否批准,需要做非常复杂的手续:先调用银行类(Bank),判断是不是有足够的存款,然后调用信用评定类(Credit),判断是不是有足够的信用等级,然后调用借款类Loan,判断是不是有坏账。如果把这些复杂的评定手续包装到一个Morgate类,只对外提供一个IsEligible窗口,判断一个顾客能否批注贷款,就非常的方便。这个例子用程序实现如下:

class MainApp
{
//Test
static void Main()
{
// Facade
Mortgage mortgage = new Mortgage();
//创建一个顾客:Tom
Customer customer = new Customer("Tom");
//判断是否能提供抵押贷款
bool eligible = mortgage.IsEligible(customer, 125000);

Console.WriteLine("\n" + customer.Name +

" has been " + (eligible ? "Approved" : "Rejected"));
// Wait for user
Console.ReadKey();
}
}
//银行类
class Bank
{
public bool HasSufficientSavings(Customer c, int amount)
{
Console.WriteLine("Check bank for " + c.Name);
return true;
}
}
//信用评定类
class Credit
{
public bool HasGoodCredit(Customer c)
{

Console.WriteLine("Check credit for " + c.Name);
return true;
}
}
//以往贷款记录类
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;
}
// Gets the name
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;
// 具体评定能否贷款的手续
if (!_bank.HasSufficientSavings(cust, amount))
{
eligible = false;
}
else if (!_loan.HasNoBadLoans(cust))
{
eligible = false;
}
else if (!_credit.HasGoodCredit(cust))
{
eligible = false;
}
return eligible;
}
}

执行结果:
Check bank for Tom
Check loans for Tom
Check credit for Tom

Tom has been Approved

没有评论:

发表评论