寂然解讀設計模式 外觀模式

2021-10-14 03:18:50 字數 3396 閱讀 9337

i walk very slowly, but i never walk backwards
寂然案例演示 - 影院管理

現在有乙個需求,完成使用家庭影院的功能,其過程為:

1.直接用遙控器:統籌各裝置開關

2.開爆公尺花機

7.去拿爆公尺花

3.放下螢幕

8.調暗燈光

4.開投影儀

5.開音響

10.觀影結束後,關閉各種裝置

解決方案一:一般方式

方案分析

可以看到,我們在客戶端中直接依賴各個裝置,根據流程呼叫物件的一系列方法,就可以完成需求,是ok的,但是同樣,將來 client 端操作各個裝置的時候,這個流程非常繁瑣,而且只要有乙個裝置發生改變,那客戶端的**就要相應進行調整,所以這種方案有幾個地方是可以進行優化的

那我們來考慮解決思路,可以定義乙個高層介面,給子系統中的一組介面提供乙個一致的介面(比如在高層介面提供四個方法 ready,play,pause,end ),用來訪問子系統中的一群介面,也就是說,就是通過定義乙個一致的介面(介面類),用以遮蔽內部子系統的細節,使得呼叫端只需跟這個介面發生呼叫,而無需關心這個子系統的內部細節,其實這種思路就是外觀模式,下面,我們一起來看一下外觀模式的基本介紹

基本介紹

外觀模式(facade pattern),也叫"門面模式",外觀模式為多個複雜的子系統提供乙個一致的介面

即通過為多個複雜的子系統提供乙個一致的介面,而使這些子系統更加容易被訪問

外觀模式通過定義乙個一致的介面,用以遮蔽內部子系統的細節,使得呼叫端只需跟這個介面發生呼叫,而無需關心這個子系統的內部細節

原理類圖

外觀模式的原理類圖如下圖所示

外觀模式角色分析

外觀類(facade):為呼叫端提供統一的呼叫介面,外觀類將呼叫端的請求**給適當的子系統物件

呼叫者(client):外觀介面的呼叫者

子系統:處理facade物件指派的任務,是功能的實際提供者

解決方案二:外觀模式

原理類圖

既然我們明確了,外觀模式的核心思想是提供乙個統一的呼叫介面,那首先我們來看,使用外觀模式的原理類圖

**演示

下面我們完成外觀模式重構案例需求的**

public class player

​ public static player getinstance()

​ public void on()

​ public void off()

​ public void play()

​ public void pause()

​ public void select()}​

//投影儀

public class projector

​ public static projector getinstance()

​ public void on()

​ public void off()

​ public void focus()

​ public void zoom()​}

​//音響

public class stereo

​ public static stereo getinstance()

​ public void on()

​ public void off()

​ public void setvolume()​}

​//爆公尺花機

public class popcorn

​ public static popcorn getinstance()

​ public void on()

​ public void off()

​ public void pop()}​

//外觀類

public class hometheate***cade

​ //把操作分成四步 準備

public void ready()

​ public void play()

​ public void pause()

​ public void end()​}

​//客戶端

public class client }

相對於一般實現方式,我們可以看到,外觀模式就是解決多個複雜介面帶來的使用困難,起到簡化使用者操作的作用,至於子系統之間的互相呼叫,由它們自己完成即可,這裡不做演示

模式總結

優勢(不要只是流程式)

注意事項

不要過多的或者不合理的使用外觀模式,要考慮是使用外觀模式好,還是直接呼叫模組好,我們的目的,是希望系統有層次,利於維護,利於擴充套件

使用場景

mybatis原始碼分析

流程分析

在 mybatis 框架中,就由使用到外觀模式,下面我們一起來進行分析,並畫出相應的類圖

我們再來看裡面的 configuration 的 newmetaobject() 方法,其實呼叫的是 metaobject 的 forobject,然後將這三個工廠物件例項傳入

我們來看 forobject 的具體實現,根據 object 的狀態,來進行不同的處理

我們進到 metaobject 的構造器

發現仍然,根據 object 型別的不同,去使用不同的 factory 物件進行相應的處理,返回不同的 metaobject的例項

類圖分析

那下面我們通過類圖來梳理這幾個類的關係

configuration 可以被認為扮演著外觀類的角色,而 defaultobjectfactory 等就是外觀類下面的各個子系統

下節預告

設計模式 外觀模式

外觀模式,我的理解就是將複雜的類進行重新封裝,將簡單的介面呈現出來,降低呼叫端和實際類的耦合性。拿 大話設計模式 上邊關於 和 的例子來說。對於不入門的股民來說,交易有些過於龐大,需要學習的東西很多,如果沒整明白就進行投資,很容易賠錢的。很多剛入 的股民都賠的很慘。而買 有提出了乙個新的觀念,我們買...

設計模式 外觀模式

何為外觀模式?外觀模式 為子系統中的一組介面提供乙個一致的介面,此模式定義了乙個高層介面,這個介面使得一子系統更加容易使用。它是一種結構型模式,它主要解決的問題是 元件的客戶和元件中各種複雜的子系統有了過多的耦合,隨著外部客戶程式和 各子系統的演化,這種過多的耦合面臨很多變化的挑戰。uml類圖 乙個...

設計模式 外觀模式

外觀模式說白了就是為一組介面提供乙個一致的介面。例如 定義三個類a b c,每個類各定義乙個方法。class a pubic void showa cout a showa pubic void showb cout b showb pubic void showc cout c showc 定義乙...