天天看點

Java經典設計模式之十一種行為型模式(附執行個體和詳解)

版權聲明:本文為部落客原創文章,轉載注明出處http://blog.csdn.net/u013142781

行為型模式細分為如下11種:政策模式、模闆方法模式、觀察者模式、疊代子模式、責任鍊模式、指令模式、備忘錄模式、狀态模式、通路者模式、中介者模式、解釋器模式。

Java經典設計模式之十一種行為型模式(附執行個體和詳解)

接下來對11種行為型模式逐個進行介紹。

首先統一接口:

輔助類:

三個實作類:

測試類:

政策模式的決定權在使用者,系統本身提供不同算法的實作,新增或者删除算法,對各種算法做封裝。是以,政策模式多用在算法決策系統中,外部使用者隻需要決定用哪個算法即可。

解釋一下模闆方法模式,就是指:一個抽象類中,有一個主方法,再定義1…n個方法,可以是抽象的,也可以是實際的方法,定義一個類,繼承該抽象類,重寫抽象方法,通過調用抽象類,實作對子類的調用。

就是在abstractcalculator類中定義一個主方法calculate,calculate()調用spilt()等,plus和minus分别繼承abstractcalculator類,通過對abstractcalculator的調用實作對子類的調用,看下面的例子:

包括這個模式在内的接下來的四個模式,都是類和類之間的關系,不涉及到繼承。

觀察者模式很好了解,類似于郵件訂閱和rss訂閱,當我們浏覽一些部落格或wiki時,經常會看到rss圖示,就這的意思是,當你訂閱了該文章,如果後續有更新,會及時通知你。其實,簡單來講就一句話:當一個對象變化時,其它依賴該對象的對象都會收到通知,并且随着變化!對象之間是一種一對多的關系。

運作結果:

也許看完執行個體之後還是比較抽象,再将文字描述和代碼執行個體看一兩遍吧,然後結合工作中看哪些場景可以使用這種模式以加深了解。

顧名思義,疊代器模式就是順序通路聚集中的對象,一般來說,集合中非常常見,如果對集合類比較熟悉的話,了解本模式會十分輕松。這句話包含兩層意思:一是需要周遊的對象,即聚集對象,二是疊代器對象,用于對聚集對象進行周遊通路。

具體來看看代碼執行個體:

輸出結果:

此處我們貌似模拟了一個集合類的過程,感覺是不是很爽?其實jdk中各個類也都是這些基本的東西,加一些設計模式,再加一些優化放到一起的,隻要我們把這些東西學會了,掌握好了,我們也可以寫出自己的集合類,甚至架構!

責任鍊模式,有多個對象,每個對象持有對下一個對象的引用,這樣就會形成一條鍊,請求在這條鍊上傳遞,直到某一對象決定處理該請求。但是發出者并不清楚到底最終那個對象會處理該請求,是以,責任鍊模式可以實作,在隐瞞用戶端的情況下,對系統進行動态的調整。

此處強調一點就是,連結上的請求可以是一條鍊,可以是一個樹,還可以是一個環,模式本身不限制這個,需要我們自己去實作,同時,在一個時刻,指令隻允許由一個對象傳給另一個對象,而不允許傳給多個對象。

指令模式很好了解,舉個例子,司令員下令讓士兵去幹件事情,從整個事情的角度來考慮,司令員的作用是,發出密碼,密碼經過傳遞,傳到了士兵耳朵裡,士兵去執行。這個過程好在,三者互相解耦,任何一方都不用去依賴其他人,隻需要做好自己的事兒就行,司令員要的是結果,不會去關注到底士兵是怎麼實作的。

指令模式的目的就是達到指令的發出者和執行者之間解耦,實作請求和執行分開,熟悉struts的同學應該知道,struts其實就是一種将請求和呈現分離的技術,其中必然涉及指令模式的思想!

主要目的是儲存一個對象的某個狀态,以便在适當的時候恢複對象,個人覺得叫備份模式更形象些,通俗的講下:假設有原始類a,a中有各種屬性,a可以決定需要備份的屬性,備忘錄類b是用來存儲a的一些内部狀态,類c呢,就是一個用來存儲備忘錄的,且隻能存儲,不能修改等操作。

如果還不能了解,可以給original類添加一個屬性name,然後其他類進行相應的修改試試。

核心思想就是:當對象的狀态改變時,同時改變其行為,很好了解!就拿qq來說,有幾種狀态,線上、隐身、忙碌等,每個狀态對應不同的操作,而且你的好友也能看到你的狀态,是以,狀态模式就兩點:1、可以通過改變狀态來獲得不同的行為。2、你的好友能同時看到你的變化。

根據這個特性,狀态模式在日常開發中用的挺多的,尤其是做網站的時候,我們有時希望根據對象的某一屬性,差別開他們的一些功能,比如說簡單的權限控制等。

通路者模式算是最複雜也是最難以了解的一種模式了。它表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用于這些元素的新操作。

涉及角色:

1.visitor 抽象通路者角色,為該對象結構中具體元素角色聲明一個通路操作接口。該操作接口的名字和參數辨別了發送通路請求給具體通路者的具體元素角色,這樣通路者就可以通過該元素角色的特定接口直接通路它。

2.concretevisitor.具體通路者角色,實作visitor聲明的接口。

3.element 定義一個接受通路操作(accept()),它以一個通路者(visitor)作為參數。

4.concreteelement 具體元素,實作了抽象元素(element)所定義的接受操作接口。

5.objectstructure 結構對象角色,這是使用通路者模式必備的角色。它具備以下特性:能枚舉它的元素;可以提供一個高層接口以允許通路者通路它的元素;如有需要,可以設計成一個複合對象或者一個聚集(如一個清單或無序集合)。

中介者模式(mediator):用一個中介對象來封裝一系列的對象互動。中介者使各對象不需要顯式地互相引用,進而使其耦合松散,而且可以獨立地改變它們之間的互動。

舉例:在一個公司裡面,有很多部門、員工(我們統稱他們互相為colleague“同僚”),為了完成一定的任務,“同僚”之間肯定有許多需要互相配合、交流的過程。如果由各個“同僚”頻繁地到處去與自己有關的“同僚”溝通,這樣肯定會形成一個多對多的雜亂的聯系網絡而造成工作效率低下。

此時就需要一位專門的“中介者”給各個“同僚”配置設定任務,以及統一跟進大家的進度并在“同僚”之間實時地進行互動,保證“同僚”之間必須的溝通交流。很明顯我們知道此時的“中介者”擔任了溝通“同僚”彼此之間的重要角色了,“中介者”使得每個“同僚”都變成一對一的聯系方式,減輕了每個“同僚”的負擔,增強工作效率。

同僚類族:

中介者類族:

解釋器模式:給定一種語言,定義他的文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中句子。

解釋器模式是一個比較少用的模式。

注,本文參考了另外一位部落客的文章,某些地方有結合自己的一些了解加以修改: 

<a href="http://blog.csdn.net/zhangerqing/article/details/8194653">http://blog.csdn.net/zhangerqing/article/details/8194653</a>