作者: 创建于:2006-03-17 出处: 收录于:2013-02-28
示意图
门面模式没有一个一般化的类图描述,下面是一个示意性的对象图:
意图
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
适用性
- 为一个复杂子系统提供一个简单接口。
- 提高子系统的独立性。
- 在层次化结构中,可以使用Facade模式定义系统中每一层的入口。
实现代码
我们平时的开发中其实已经不知不觉的在用Façade模式,现在来考虑这样一个抵押系统,当有一个客户来时,有如下几件事情需要确认:到银行子系统查询他是否有足够多的存款,到信用子系统查询他是否有良好的信用,到贷款子系统查询他有无贷款劣迹。只有这三个子系统都通过时才可进行抵押。
View Code
1 using System; 2 //银行子系统 3 public class Bank 4 { 5 public bool HasSufficientSavings(Customer c, int amount) 6 { 7 Console.WriteLine("Check bank for " + c.Name); 8 return true; 9 }10 }11 //信用证子系统12 public class Credit13 {14 public bool HasGoodCredit(Customer c)15 {16 Console.WriteLine("Check credit for " + c.Name);17 return true;18 }19 }20 //贷款子系统21 public class Loan22 {23 public bool HasNoBadLoans(Customer c)24 {25 Console.WriteLine("Check loans for " + c.Name);26 return true;27 }28 }29 //顾客类30 public class Customer31 {32 private string name;33 public Customer(string name)34 {35 this.name = name;36 }37 public string Name38 {39 get { return name; }40 }41 }42 //外观类43 public class Mortgage44 {45 private Bank bank = new Bank();46 private Loan loan = new Loan();47 private Credit credit = new Credit();48 public bool IsEligible(Customer cust, int amount)49 {50 Console.WriteLine("{0} applies for {1:C} loan\n",51 cust.Name, amount);52 bool eligible = true;53 if (!bank.HasSufficientSavings(cust, amount))54 {55 eligible = false;56 }57 else if (!loan.HasNoBadLoans(cust))58 {59 eligible = false;60 }61 else if (!credit.HasGoodCredit(cust))62 {63 eligible = false;64 }65 return eligible;66 }67 }68 //客户程序类69 public class MainApp70 {71 public static void Main()72 {73 //外观74 Mortgage mortgage = new Mortgage();75 Customer customer = new Customer("Ann McKinsey");76 bool eligable = mortgage.IsEligible(customer, 125000);77 Console.WriteLine("\n" + customer.Name +78 " has been " + (eligable ? "Approved" : "Rejected"));79 Console.ReadLine();80 }81 }
效果及实现要点
1.Façade模式对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
2.Façade模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。
3.如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性与通用性之间选择。