設計模式 結構型模式 5 外觀模式

2022-02-20 12:20:35 字數 2378 閱讀 5778

在現實生活中,常常存在辦事較複雜的例子,如辦房產證或註冊一家公司,有時要同多個部門聯絡,這時要是有乙個綜合部門能解決一切手續問題就好了。

軟體設計也是這樣,當乙個系統的功能越來越強,子系統會越來越多,客戶對系統的訪問也變得越來越複雜。這時如果系統內部發生改變,客戶端也要跟著改變,這違背了「開閉原則」,也違背了「迪公尺特法則」,所以有必要為多個子系統提供乙個統一的介面,從而降低系統的耦合度,這就是外觀模式的目標。

外觀(facade)模式又叫作門面模式,是一種通過為多個複雜的子系統提供乙個一致的介面,而使這些子系統更加容易被訪問的模式。該模式對外有乙個統一介面,外部應用程式不用關心內部子系統的具體細節,這樣會大大降低應用程式的複雜度,提高了程式的可維護性。

在日常編碼工作中,我們都在有意無意的大量使用外觀模式。只要是高層模組需要排程多個子系統(2 個以上的類物件),我們都會自覺地建立乙個新的類封裝這些子系統,提供精簡的介面,讓高層模組可以更加容易地間接呼叫這些子系統的功能。尤其是現階段各種第三方 sdk、開源類庫,很大概率都會使用外觀模式。

外觀模式是「迪公尺特法則」的典型應用,它有以下主要優點。

外觀模式的主要缺點如下。

外觀模式的結構比較簡單,主要是定義了乙個高層介面。它包含了對各個子系統的引用,客戶端可以通過它訪問各個子系統的功能。現在來分析其基本結構和實現方法。

外觀模式包含以下主要角色。

其結構圖如下圖所示:

外觀模式的實現**如下:

#include using namespace std;

// 子系統角色1

class subsystem01

};// 子系統角色2

class subsystem02

};// 子系統角色3

class subsystem03

};// 外觀角色

class facade

private:

subsystem01 *obj1 = new subsystem01();

subsystem02 *obj2 = new subsystem02();

subsystem03 *obj3 = new subsystem03();

};int main()

程式執行結果如下:

子系統01的method1()被呼叫!

子系統02的method2()被呼叫!

子系統03的method3()被呼叫!

舉個例子,比如我們每天開啟電腦時,都需要做三件事:

每天下班時,關機前需要做三件事:

用程式模擬如下:

#include using namespace std;

// 子系統角色:瀏覽器類

class browser

static void close()

};// 子系統角色:ide類

class ide

static void close()

};// 子系統角色:wechat類

class wechat

static void close()

};int main()

執行程式,輸出如下:

上班:

開啟瀏覽器

開啟 ide

下班:關閉瀏覽器

關閉 ide

由於我們每天都要做這幾件事,所以我們可以使用外觀模式,將這幾個子系統封裝起來,提供更簡潔的介面:

// 外觀角色

class facade

void close()

};

客戶端就可以簡化**,只和這個外觀類打交道:

int main()

執行程式,輸出與之前一樣。

外觀模式就是這麼簡單,它使得兩種不同的類不用直接互動,而是通過乙個中介軟體——也就是外觀類——間接互動。外觀類中只需要暴露簡潔的介面,隱藏內部的細節,所以說白了就是封裝的思想。

外觀模式非常常用,(當然了!寫**哪有不封裝的!)尤其是在第三方庫的設計中,我們應該提供盡量簡潔的介面供別人呼叫。另外,在 mvc 架構中,c 層(controller)就可以看作是外觀類,model 和 view 層通過 controller 互動,減少了耦合。

參考:

知乎 - 如何學習設計模式? 熱門回答

外觀模式(facade模式)詳解

菜鳥教程 - 設計模式篇

設計模式 結構型模式 外觀模式

粗淺地理解,外觀模式的核心思想就是把分散的方法集中到乙個方法a裡呼叫,外部只需要呼叫a方法就可以把所有的方法都跑一遍,簡單省事。例如上圖的病人看病流程。假設有guahao menzhen huajia quyao 4個方法,如果沒有外觀模式,100個地方用到這個流程,四個方法每個都要各寫100遍呼叫...

設計模式 結構型模式 外觀模式

組建乙個家庭影院 傳 統方式解決影院管理 clienttest 傳統方式解決影院管理問題分析 1 在clienttest 的main方法中,建立各個子系統的物件,並直接去呼叫子系統 物件 相關方法,會造成呼叫過程混亂,沒有清晰的過程 2 不利於在clienttest 中,去維護對子系統的操作 3 解...

結構型模式 外觀模式

外觀模式 facade 為子系統中的一組介面提供乙個一致的介面,此模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。外觀模式將客戶端與子系統的內部複雜性進行分隔開,使得客戶端只需要與外觀物件打交道,而不需要與子系統內部的很多物件打交道。外觀模式的目的在於減少系統的複雜程度。在物件導向軟體系...