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 定義乙...