Intent
替子系统里的一堆介面定义一套统一的高阶介面,让子系统更易使用。
Introduction
Facade常用在两个地方,第一种用法是将原来程序导向的系统,利用Facade包成OO,如MFC包装Win32 API,第二种用法是将原来复杂的OO系统,再包成更简单的OO,如.NET Enterprise Library将.NET Framework再做一次包装,让你更容易使用.NET。另外3-tier也是典型Facade的应用,DAL(Data Access Layer)就是一个Facade,让BLL(Business Logic Layer)在存取资料时,不用对付ADO.NET复杂的机制,只需面对DAL即可。
Sample Code
如我们坐捷运买票,目前的卖票的机器只能吃铜板,所以得另外的提供换钞机,让旅客将纸币换成铜板,也就是说,若一个旅客身上只有纸币又要卖捷运票,他必须做两个步骤,先将纸币换成铜板,再用铜板去买车票。
1/**//*
2(C) OOMusou 2007 http://oomusou.cnblogs.com
3
4Filename : DP_FacadePattern1_before.cpp
5Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
6Description : Demo how to use Facade pattern (before)
7Release : 04/24/2007 1.0
8*/
9#include <iostream>
10
11using namespace std;
12
13struct Bill {
14 int value;
15 Bill(int value) : value(value) {}
16};
17
18struct Coin {
19 int value;
20 Coin(int value) : value(value) {}
21};
22
23class BillToCoinMachine {
24public:
25 Coin getCoin(Bill bill) {
26 return Coin(10);
27 }
28};
29
30class CoinToTicketMachine {
31public:
32 void getTicket(Coin coin) {
33 cout << "Get ticket" << endl;
34 }
35};
36
37int main() {
38 BillToCoinMachine machine1;
39 Coin coin = machine1.getCoin(Bill(100));
40
41 CoinToTicketMachine machine2;
42 machine2.getTicket(coin);
43}
執行結果
Get ticket