為子系統中的一組介面提供一個統一的高層介面,使子系統更容易被使用。
外觀模式常見於兩類場景:
三層架構也是典型的外觀模式應用:資料存取層 (DAL) 即為一個外觀,讓業務邏輯層 (BLL) 在存取資料時無需直接面對 ADO.NET 的複雜機制,只需與 DAL 互動即可。
假設捷運售票機只接受硬幣,乘客若只有紙鈔,必須先到換鈔機換成硬幣,再到售票機買票,需排兩次隊,過程繁瑣。
/**/*
(C) OOMusou 2007 https://oomusou.cnblogs.com
Filename : DP_FacadePattern1_before.cpp
Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
Description : Demo how to use Facade pattern (before)
Release : 04/24/2007 1.0
*/
#include <iostream>
using namespace std;
struct Bill {
int value;
Bill(int value) : value(value) {}
};
struct Coin {
int value;
Coin(int value) : value(value) {}
};
class BillToCoinMachine {
public:
Coin getCoin(Bill bill) {
return Coin(10);
}
};
class CoinToTicketMachine {
public:
void getTicket(Coin coin) {
cout << "Get ticket" << endl;
}
};
int main() {
BillToCoinMachine machine1;
Coin coin = machine1.getCoin(Bill(100));
CoinToTicketMachine machine2;
machine2.getTicket(coin);
}
執行結果:
Get ticket
我們設計一台整合機器,直接接受紙鈔並出票,對乘客更友好。實際上不需重新設計硬體,只需將兩台機器整合即可。
/**/*
(C) OOMusou 2007 https://oomusou.cnblogs.com
Filename : DP_FacadePattern1_after.cpp
Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
Description : Demo how to use Facade pattern (after)
Release : 04/24/2007 1.0
*/
#include <iostream>
using namespace std;
struct Bill {
int value;
Bill(int value) : value(value) {}
};
struct Coin {
int value;
Coin(int value) : value(value) {}
};
class BillToCoinMachine {
public:
Coin getCoin(Bill bill) {
return Coin(10);
}
};
class CoinToTicketMachine {
public:
void getTicket(Coin coin) {
cout << "Get ticket" << endl;
}
};
class TicketMachineFacade {
public:
void coinToTicket(Coin coin) {
CoinToTicketMachine machine;
machine.getTicket(coin);
}
void billToTicket(Bill bill) {
BillToCoinMachine machine1;
Coin coin = machine1.getCoin(bill);
CoinToTicketMachine machine2;
machine2.getTicket(coin);
}
};
int main() {
TicketMachineFacade TMFacade;
TMFacade.billToTicket(Bill(100));
TMFacade.coinToTicket(Coin(10));
}
執行結果:
Get ticket
Get ticket
客戶端程式碼變得乾淨許多:
int main() {
TicketMachineFacade TMFacade;
TMFacade.billToTicket(Bill(100));
TMFacade.coinToTicket(Coin(10));
}
這表示旅客可以用更簡單的方式買票了。
外觀模式或許看似單純,只是一個概念,但它在實務中極為常見。