《設計模式》學習筆記8 外觀模式

2021-09-22 13:38:44 字數 2181 閱讀 3603

外觀模式引用書中的定義如下:

為子系統中的一組介面提供乙個統一的入口。外觀模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。

外觀模式又稱為門面模式,它是一種物件結構型模式。外觀模式是迪公尺特法則的一種具體實

現,通過引入乙個新的外觀角色可以降低原有系統的複雜度,同時降低客戶類與子系統的耦

合度。

對於這個模式的理解,我覺得著重點在於幾個詞上,分別是一組介面統一入口降低複雜度

結合我們目前的系統進行說明,首先說什麼是一組介面。

在我們的系統中,由於業務需要,有三種日誌,分別是系統日誌、告警日誌、監控日誌,我用非正式的**簡單表示如下:

系統日誌類介面定義:

/**

public class loghandle }

告警日誌類介面定義:

/**

public class alarmlogservice }

監控日誌類介面:

/**

public class monitorlogservice }

上邊三個日誌介面為了表示功能的不同,簡單地對日誌內容進行了不同的拼接,實際專案中自然不會這樣。

這三個日誌介面,都是屬於日誌的操作,只是列印出的日誌內容被不同的系統採集再使用,而且他們基本上也都同時被使用到,所以可以說他們就是屬於外觀模式定義中的那一組介面

在沒有使用外觀模式的情況下,我們在業務**中需要列印日誌的時候可能就會是下邊所示這樣:

/**

public class blogservice catch (exception e) ", new object );

alarmlogservice.error("系統異常{}", new object );

monitorlogservice.error("系統異常{}", new object );}}}

/**

public class userservice catch (exception e) ", new object );

alarmlogservice.error("系統異常{}", new object );

monitorlogservice.error("系統異常{}", new object );}}}

很顯然,兩個service中有大量重複的**。這裡只有兩個類列印日誌,就需要一共呼叫6次日誌列印方法,每多出乙個類需要列印這樣的日誌,就會以3的倍數增加**。

而且這裡的示例幾乎是最簡單的,在實際業務開發的時候可能就遠不止三行。

同時,像上邊這種做法,假如後續日誌系統增多,需要增加到四種甚至五種或者更多,那個每個列印日誌的類都需要進行相應的修改,很顯然,這是極不利於維護和拓展的。

因此,按照常規的思路,可能就會有兩種做法:

一種是把這種列印日誌的**進行提取,封裝為乙個方法進行呼叫。但是這種做法會存在一定的問題,首先,這個方法本身和業務是無關的,放在業務類中不合適。其次,除非所有需要列印日誌的類都有乙個共同的父類,把這個方法放在父類中,否則就需要定義多次該方法。

於是乎,就有了第二種做法,那就是把這段**提取到另外乙個類中,那麼這個類就是所謂的外觀類了:

/**

public class loghandle }

有了這樣乙個類之後,我們的業務**呼叫的時候就只需要一次就可以搞定,而這個管理日誌操作的類就是統一介面

/**

public class userservice catch (exception e) ", new object );}}}

與此同時,如果後續日誌系統變化,不論是增加新的日誌型別,還是刪減舊的日誌型別,都只需要改動loghandle類就可以了,而且每個呼叫日誌的地方**也都減少了很多,這就大大降低了系統的複雜度

需要有一組介面,他們幾乎都是成套被使用;

乙個外觀類或介面,實際操作上邊的一組介面,而提供乙個公開的介面方法供外部呼叫;

客戶端只需要一次呼叫外觀類的介面,而不需要分別呼叫最開始那一組介面的每乙個。

在沒有學這個模式的時候,我覺得單例模式是最簡單的設計模式,而現在來看,這個似乎才是最簡單的設計模式。

設計模式8 外觀模式

為子系統中的一組介面提供乙個一致的介面,此模式定義了乙個高層介面,這個介面使得這個子系統更加容易使用。public class subsystemone public class subsystemtwo public class subsystemthree public class subsys...

設計模式 8 外觀模式

定義 為子系統中的一組介面提供乙個一致的介面,此模式定義了乙個高層介面,這個介面使得子系統更加容易使用。使用場景 當子系統的介面過於複雜時,比如經典的三層架構,就需要考慮在資料訪問層和業務邏輯層,業務邏輯層和表示層的層與層之間建立外觀。以達到簡化目的,降低耦合 實現 建立外觀類,聚合子系統各個介面,...

Java設計模式8 外觀模式

外觀模式隱藏了系統的複雜性,並向客戶端提供了乙個可以訪問系統的介面。這種型別的設計模式屬於結構性模式。為子系統中的一組介面提供了乙個統一的訪問介面,這個介面使得子系統更容易被訪問或者使用。1 外觀角色 外觀模式的核心。它被客戶角色呼叫,它熟悉子系統的功能。內部根據客戶角色的需求預定了幾種功能的組合。...