文章目錄
- 外觀模式(Facade Pattern)概述
- 定義
- 外觀模式UML圖
- 作用
- 外觀模式的結構
- C++ 代碼示例1
- C++代碼示例2
- 總結
外觀模式(Facade Pattern)概述
定義
外觀模式是一種結構型設計模式,它為子系統中的一組接口提供了一個統一的高層接口,這個接口使得子系統更容易使用。外觀模式隱藏了系統的復雜性,并向客戶端提供了一個簡單的接口,通過這個接口客戶端可以訪問系統的功能。
外觀模式UML圖
作用
簡化了復雜系統的使用。例如,在一個大型軟件系統中,可能有多個子系統,每個子系統都有很多接口和操作。對于客戶端來說,直接使用這些子系統會很復雜。外觀模式通過提供一個統一的接口,讓客戶端只需要和這個接口交互,而不用關心子系統內部的細節。
降低了系統的耦合度。客戶端只依賴于外觀類,而不是直接依賴于子系統的眾多類。這樣,當子系統的內部結構發生變化時,只要外觀類的接口不變,客戶端就不需要修改代碼。
外觀模式的結構
外觀類(Facade):它知道哪些子系統類負責處理請求,并將客戶端的請求代理給適當的子系統對象。外觀類是客戶端和子系統之間的橋梁。
子系統類(Subsystem Classes):實現系統的具體功能。它們可以被外觀類組合和調用,以完成客戶端請求的復雜操作。
C++ 代碼示例1
假設我們有一個家庭影院系統,它包括一個DVD播放器、一個投影儀和一個音響系統。每個設備都有自己的接口和操作,現在我們使用外觀模式來提供一個簡單的家庭影院控制接口。
#include<iostream>
#include<string>// 子系統類:DVD播放器
class DVDPlayer
{
public:void on() {std::cout << "DVD Player is on." << std::endl;}void play(){std::cout << "DVD Player is playing." << std::endl;}void off(){std::cout << "DVD Player is off." << std::endl;}
};
// 子系統類:投影儀
class Projector
{
public:void on(){std::cout << "Projector is on." << std::endl;}void project(){std::cout << "Projector is projecting." << std::endl;}void off(){std::cout << "Projector is off." << std::endl;}
};
// 子系統類:音響系統
class SoundSystem
{
public:void on(){std::cout << "Sound System is on." << std::endl;}void setVolume(int volume) {std::cout << "Sound System volume set to " << volume << std::endl;}void off(){std::cout << "Sound System is off." << std::endl;}
};
// 外觀類:家庭影院外觀
class HomeTheaterFacade
{
private:DVDPlayer dvdPlayer;Projector projector;SoundSystem soundSystem;
public:void watchMovie(){dvdPlayer.on();projector.on();soundSystem.on();dvdPlayer.play();projector.project();soundSystem.setVolume(7);}void endMovie() {dvdPlayer.off();projector.off();soundSystem.off();}
};int main()
{HomeTheaterFacade homeTheater;homeTheater.watchMovie();std::cout << "------------Movie is over.-------------------" << std::endl;homeTheater.endMovie();return 0;
}
在這個示例中,HomeTheaterFacade類是外觀類。它包含了DVDPlayer、Projector和SoundSystem這三個子系統類的對象。watchMovie方法提供了一個簡單的接口來啟動家庭影院系統,讓所有設備進入播放電影的狀態。endMovie方法則用于關閉所有設備。客戶端(main函數)只需要和HomeTheaterFacade類交互,而不用關心每個設備(子系統)的具體操作和狀態,這樣就簡化了家庭影院系統的使用。
C++代碼示例2
#include<iostream>
using namespace std;
//外觀模式:為子系統提供一個一支的潔面,定義一個
//高層的接口,這一接口使得子系統更加容易使用
class system1
{
public:void method1(){cout<<"method1"<<endl;}
};class system2
{
public:void method2(){cout<<"method2"<<endl;}
};class system3
{
public:void method3(){cout<<"method3"<<endl;}
};
//接口
class facede
{system1 *s1;system2 *s2;system3 *s3;
public://構造函數facede(){s1 = new system1();s2 = new system2();s3 = new system3();}//void methoda(){s1->method1();s2->method2();}//void methodb(){s3->method3();}
};
int main()
{facede *p = new facede();p->methoda();p->methodb();return 0;
}
總結
外觀模式本質上應了計算機網絡領域的一句名言:計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決;
外觀模式里的外觀類就是一個中間層。