设计模式之*
今天來聊一聊剩下的常用的設計模式!
1.觀察者模式
假如有一個小孩,我需要在他睡醒之后,給他喝奶。我們大概可以這樣做,設一個標志位=false,當小孩醒的時候,標志=true;
寫一個Dad類,定義一個方法,寫一個空循環,直到flag=true,跳出循環,執行下面的操作,喂奶,這樣做,我們需要兩個線程,讓Dad的方法
在主線程里面跑,為小孩類,再開一個線程。
確實,上面的方法沒有問題,也萬全可以這樣做,但是主線程必須不斷地去檢測標志位的值,不斷地去校驗,想想這樣子也不是很科學,十分地浪費資源。
這樣,我們來換一個思路,現在不讓Dad實時地去監測小孩類,我們在小孩睡醒后,給Dad類,發一個通知,告訴Dad,我醒了,讓Dad給小孩喝奶,
具體的代碼實現,大概是這樣寫的;小孩類中,實例化一個Dad類對象dad,在小孩的wake()方法中,去調用dad的nurse()方法進行喂奶。
這樣做,可以節省線程上的資源,實現起來也相對簡單。
JDK中awt,我自己是用得很少,可以幾乎說是陌生,當時awt中有類似的實現。有一個Button類,里面有一個List,裝著一群ActionListener,當觸發Button的press方法的時候,遍歷List,傳給ActionListener一個ActionEvent對象,讓這些ActionListener對這個ActionEvent對象逐一地做出響應。這就是觀察者模式,讓主題或者通知者去傳遞事件,去通知觀察者,觀察者做出響應!
2.brige(橋接)模式
在兩個維度進行排列組合的時候,你可以使用橋接模式,采用內聚的方式實現。用聚合去代替繼承!
在看馬老師的視頻的時候,他舉了這樣的一個例子,關于送禮物的問題。
禮物有很多種類,當從不同方向維度去分類的時候,會出現交叉的情況。
比如說 浪漫的,驚喜的,另類的(這可以說是一個維度)
按實物去劃分,可以是 花,戒指。
現在問題來了,怎么送浪漫的花,或者說另類的戒指的,
如果你簡單地寫了一個Gift類,然后寫5個繼承,浪漫,驚喜,另類,花,戒指。然后你想去送另類的戒指,這個時候就非常地難辦。
存在多個維度的時候,這個簡單的單繼承是很難去解決問題的,你可以這樣寫,
在寫一個GiftImpl類,讓花,戒指去繼承它,
讓浪漫,驚喜,另類去繼承Gift類,
然后呢在Girf類中定義一個GiftImpl的引用,在子類的構造方法中傳入一個實現GirtImpl的子類。
在送禮物的時候,你就可以new?Offbeat(new Ring());這就是一個另類的戒指,好的,你可以拿去送人了.
3.Adapter(適配器)模式
舉個最簡單的例子,用過手機的都知道,你除了數據線,還需要一個適配器的頭,為什么?
中國的電壓是220v,你讓他直接輸到你的手機里?怎么可能?手機是受不了這么大的電壓的,所有需要一個轉換頭,將輸出電壓適配到你手機所能接受的電壓。
如果你要從java中去看待這個問題,我大概能說出兩個方面,
JDBC-ODBC,說的是你用java去操控微軟的數據庫(access),就是你寫java代碼 通過適配器轉成obdc的代碼,間接地去操控access.
還有一個就是java.io中的類 InputStreamReader()就是將InputStream轉化成Reader
4.Command(命令)模式
個人覺得沒什么好講的,就是封裝命令,讓命令的發送者,調用命令的執行者去執行命令。
5.state模式
狀態決定執行,語法上的實現和策略模式差不多!學到這里,23中設計模式的區分,更多的是語義,語法上的實現可能差不多!
6.mediator模式
調停者
7.facade
action去調用service層,service可以說是一個facade
轉載于:https://www.cnblogs.com/think-in-java/p/4771076.html
總結
- 上一篇: 字符流与字节流转换输出
- 下一篇: asp.net ajax控件工具集 Au