设计模式:外观模式(Façade Pattern)

作者:TerryLee  创建于:2006-03-17 出处:http://terrylee.cnblogs.com/archive/2006/03/17/352349.html  收录于: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 Credit
13 {
14     public bool HasGoodCredit(Customer c)
15     {
16         Console.WriteLine("Check credit for " + c.Name);
17         return true;
18     }
19 }
20 //贷款子系统
21 public class Loan
22 {
23     public bool HasNoBadLoans(Customer c)
24     {
25         Console.WriteLine("Check loans for " + c.Name);
26         return true;
27     }
28 }
29 //顾客类
30 public class Customer
31 {
32     private string name;
33     public Customer(string name)
34     {
35         this.name = name;
36     }
37     public string Name
38     {
39         get { return name; }
40     }
41 }
42 //外观类
43 public class Mortgage
44 {
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 MainApp
70 {
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.如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性与通用性之间选择。

 

posted @ 2013-02-28 18:08  明-Ming  阅读(788)  评论(0编辑  收藏  举报