Java設計模式之職責型模式總結

出處地址:http://www.cnblogs.com/V1haoge/p/6548127.html

  所謂職責型模式,就是採用各種模式來分配各個類的職責。

  職責型模式包括:單例模式、觀察者模式、調停者模式、代理模式、職責鏈模式、享元模式六大模式。

編號設計模式使用場景
1單例模式將職責集中到某個類的單個實例中
2觀察者模式將對象從依賴他的對象中解耦
3調停者模式將職責集中在某個類,該類可以監督其他對象的交互
4代理模式讓一個對象扮演其他對象的行爲
5職責鏈模式允許將請求傳遞給職責鏈的其他對象,直到這個請求被某個對象處理
6享元模式將共享的、細粒度的對象職責集中管理

  現在分別講述:

1、單例模式——將職責集中到某個類的單個實例中

  通過編碼來限制某個類只能生成一個實例對象,所有針對該類的訪問全部體現到這個實例身上。正如Spring中體現的:在Spring的上下文(ApplicationContext)創建之後,會通過掃描器將所有標註註解的類各生成一個實例,並將這個實例保存到這個上下文環境(ApplicationContext)中,程序啓動完成後,需要使用某個類的實例時,就從這個上下文環境中獲取。由於採用的是單例模式,所以針對一個類的多次訪問所獲取的對象爲同一對象,這些調用者可能同時調用這個實例來完成某種功能。

  從內存的方面考慮,當這個單例生成之後,會保存在Java堆內存中,以備調用,其中成員變量保存在實例中,而局部變量在方法中(此時是沒有存放位置和值的,只有方法被調用時,纔會生成局部變量的存儲位置與值,這個位置在線程中,而不再方法中),這些局部變量保存在每一個調用線程中,因此局部變量不會產生衝突(各執一份),但是成員變量是公用的,一旦涉及到對其的修改,就會發生衝突,這時最好的解決方法就是加鎖(使用synchronized),加鎖的目的(或者說是效果)就是控制CPU在執行某個線程時不會中斷,具體說就是控制在單例中的某個方法的某一段代碼塊被執行時CPU會一直執行完畢,不會中斷線程去執行別的線程,這樣當另一線程執行時不會對之前執行中的線程產生影響(因爲之前的線程已經執行完畢),他獲得的將會是原始的數據(針對成員變量)。

  題外話:高併發的兩個影響:1-高併發會導致服務器高壓力(解決方法:消息隊列、緩存、分佈集羣、負載均衡等);2-高併發會導致訪問衝突(解決方法:加鎖)

2、觀察者模式——將對象從依賴它的對象中解耦

  當一個對象被多個其他對象所依賴,一旦修改這個對象,將會對所有依賴於它的對象造成影響,解耦勢在必行。採用觀察者模式,將所有依賴於這個對象的對象抽象成爲觀察者,所有具體的觀察者都實現(繼承)觀察者接口(抽象類),然後修改這個被依賴對象的類,在其內部添加觀察者集合及集合操作(增加觀察者,刪除觀察者等),以此來實現觀察者模式。

  因爲被觀察者與觀察者的關係是一對多的關係,而且這些觀察者可以被動態增刪,所以需要使用集合來保存這些觀察者對象,並提供增刪操作。

  觀察者模式又稱爲發佈-訂閱模式,顯而易見,發佈與訂閱分屬雙方,發佈一方可看成被依賴對象,訂閱一方是依賴對象,一個消息發佈,所有的訂閱者都能查收到提示信息,並查看這條消息。

3、調停者模式——將職責集中在某個類,該類可以監督其他對象的交互

  調停者,即調解者,意即處理複雜關係,調理順序,規整結構,使變得順序井然,結構簡單,去雜存真。

  將系統中雜亂的調用關係轉換到調停者身上,所有的互動都經過調停者的中轉來完成,複雜的調用變得方向一致對向調停者。

  實現方法很簡單,創建一個調停者類,將所有的調用請求都綁定到該類身上即可。

  調停者模式是爲了去除系統內部的複雜性而產生的。

4、代理模式——讓一個對象辦理其他對象的行爲

  代理的目的其實是爲了隱藏,將真正的操作隱藏起來,對外只提供一個接口,調用者只需知道這個接口的作用,而不必知道如何來實現這個功能。

  其實代理除了上面的作用之外,還有擴展功能的作用,創建一個目標類的代理類,在代理類的方法中調用目標類的方法,而在代理類的方法中還可以添加其他代碼,這樣在不修改目標類的情況下實現了功能擴展。

  代理有兩種:靜態代理與動態代理,動態代理又分爲兩種:JDK動態代理與CGLIB動態代理。

  靜態代理是編譯時代理,而動態代理是運行時代理。

5、責任鏈模式——允許將請求傳遞給職責鏈的其他對象,直到這個請求被某個對象處理

  通過代碼將一系列請求處理對象串聯起來,就形成了一條職責鏈,這裏的職責就是處理請求,串聯的方式很簡單,在每一個請求處理對象中都擁有一個指向下一個請求處理對象的成員變量,而在處理代碼中擁有是否跳向下一個請求處理對象的判斷,這樣通過對成員變量賦值的方式就可以形成這樣一條請求處理鏈。

  這種模式一般處理現實中類似的情況。

6、享元模式——將共享的、細粒度的對象職責集中管理

  享元就是共享單元,共享元素,元素就是最基本單位,所謂細粒度就是針對元素而言的。將一系列調用中公共的處理部分完全可以單列出來,形成一個單獨的實例對象,被統一調用,而不用爲每個調用生成一份實例,大大的節省了內存空間,類似於單例模式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章