定义:用于为子系统中的接口提供统一的接口。

Facade设计模式定义了一个较高级的接口,它使得子系统的使用更加容易。

UML:

示例:

View Code
  1 // Facade pattern -- Structural example 
2
3
4 using System;
5
6
7 namespace DoFactory.GangOfFour.Facade.Structural
8
9 {
10
11 /// <summary>
12
13 /// MainApp startup class for Structural
14
15 /// Facade Design Pattern.
16
17 /// </summary>
18
19 class MainApp
20
21 {
22
23 /// <summary>
24
25 /// Entry point into console application.
26
27 /// </summary>
28
29 public static void Main()
30
31 {
32
33 Facade facade = new Facade();
34
35
36 facade.MethodA();
37
38 facade.MethodB();
39
40
41 // Wait for user
42
43 Console.ReadKey();
44
45 }
46
47 }
48
49
50
51 /// <summary>
52
53 /// The 'Subsystem ClassA' class
54
55 /// </summary>
56
57 class SubSystemOne
58
59 {
60
61 public void MethodOne()
62
63 {
64
65 Console.WriteLine(" SubSystemOne Method");
66
67 }
68
69 }
70
71
72
73 /// <summary>
74
75 /// The 'Subsystem ClassB' class
76
77 /// </summary>
78
79 class SubSystemTwo
80
81 {
82
83 public void MethodTwo()
84
85 {
86
87 Console.WriteLine(" SubSystemTwo Method");
88
89 }
90
91 }
92
93
94
95 /// <summary>
96
97 /// The 'Subsystem ClassC' class
98
99 /// </summary>
100
101 class SubSystemThree
102
103 {
104
105 public void MethodThree()
106
107 {
108
109 Console.WriteLine(" SubSystemThree Method");
110
111 }
112
113 }
114
115
116
117 /// <summary>
118
119 /// The 'Subsystem ClassD' class
120
121 /// </summary>
122
123 class SubSystemFour
124
125 {
126
127 public void MethodFour()
128
129 {
130
131 Console.WriteLine(" SubSystemFour Method");
132
133 }
134
135 }
136
137
138
139 /// <summary>
140
141 /// The 'Facade' class
142
143 /// </summary>
144
145 class Facade
146
147 {
148
149 private SubSystemOne _one;
150
151 private SubSystemTwo _two;
152
153 private SubSystemThree _three;
154
155 private SubSystemFour _four;
156
157
158
159 public Facade()
160
161 {
162
163 _one = new SubSystemOne();
164
165 _two = new SubSystemTwo();
166
167 _three = new SubSystemThree();
168
169 _four = new SubSystemFour();
170
171 }
172
173
174
175 public void MethodA()
176
177 {
178
179 Console.WriteLine("\nMethodA() ---- ");
180
181 _one.MethodOne();
182
183 _two.MethodTwo();
184
185 _four.MethodFour();
186
187 }
188
189
190
191 public void MethodB()
192
193 {
194
195 Console.WriteLine("\nMethodB() ---- ");
196
197 _two.MethodTwo();
198
199 _three.MethodThree();
200
201 }
202
203 }
204
205 }
206

输出:

MethodA() ----

SubSystemOne Method

SubSystemTwo Method

SubSystemFour Method
MethodB() ----

SubSystemTwo Method

SubSystemThree Method

View Code
  1 // Facade pattern -- Real World example 
2
3
4 using System;
5
6
7 namespace DoFactory.GangOfFour.Facade.RealWorld
8
9 {
10
11 /// <summary>
12
13 /// MainApp startup class for Real-World
14
15 /// Facade Design Pattern.
16
17 /// </summary>
18
19 class MainApp
20
21 {
22
23 /// <summary>
24
25 /// Entry point into console application.
26
27 /// </summary>
28
29 static void Main()
30
31 {
32
33 // Facade
34
35 Mortgage mortgage = new Mortgage();
36
37
38 // Evaluate mortgage eligibility for customer
39
40 Customer customer = new Customer("Ann McKinsey");
41
42 bool eligible = mortgage.IsEligible(customer, 125000);
43
44
45 Console.WriteLine("\n" + customer.Name +
46
47 " has been " + (eligible ? "Approved" : "Rejected"));
48
49
50 // Wait for user
51
52 Console.ReadKey();
53
54 }
55
56 }
57
58
59
60 /// <summary>
61
62 /// The 'Subsystem ClassA' class
63
64 /// </summary>
65
66 class Bank
67
68 {
69
70 public bool HasSufficientSavings(Customer c, int amount)
71
72 {
73
74 Console.WriteLine("Check bank for " + c.Name);
75
76 return true;
77
78 }
79
80 }
81
82
83 /// <summary>
84
85 /// The 'Subsystem ClassB' class
86
87 /// </summary>
88
89 class Credit
90
91 {
92
93 public bool HasGoodCredit(Customer c)
94
95 {
96
97 Console.WriteLine("Check credit for " + c.Name);
98
99 return true;
100
101 }
102
103 }
104
105
106 /// <summary>
107
108 /// The 'Subsystem ClassC' class
109
110 /// </summary>
111
112 class Loan
113
114 {
115
116 public bool HasNoBadLoans(Customer c)
117
118 {
119
120 Console.WriteLine("Check loans for " + c.Name);
121
122 return true;
123
124 }
125
126 }
127
128
129 /// <summary>
130
131 /// Customer class
132
133 /// </summary>
134
135 class Customer
136
137 {
138
139 private string _name;
140
141
142 // Constructor
143
144 public Customer(string name)
145
146 {
147
148 this._name = name;
149
150 }
151
152
153
154 // Gets the name
155
156 public string Name
157
158 {
159
160 get { return _name; }
161
162 }
163
164 }
165
166
167
168 /// <summary>
169
170 /// The 'Facade' class
171
172 /// </summary>
173
174 class Mortgage
175
176 {
177
178 private Bank _bank = new Bank();
179
180 private Loan _loan = new Loan();
181
182 private Credit _credit = new Credit();
183
184 public bool IsEligible(Customer cust, int amount)
185 {
186
187 Console.WriteLine("{0} applies for {1:C} loan\n",
188
189 cust.Name, amount);
190
191 bool eligible = true;
192
193
194 // Check creditworthyness of applicant
195
196 if (!_bank.HasSufficientSavings(cust, amount))
197
198 {
199
200 eligible = false;
201
202 }
203
204 else if (!_loan.HasNoBadLoans(cust))
205
206 {
207
208 eligible = false;
209
210 }
211
212 else if (!_credit.HasGoodCredit(cust))
213
214 {
215
216 eligible = false;
217
218 }
219
220 return eligible;
221
222 }
223
224 }
225
226 }
227

输出:

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