行為型模式(11種)

一贯钩、責任鏈模式(Chain of Responsibility Pattern)

意圖:創(chuàng)建一個處理請求的對象鏈,對象發(fā)送者和對象接受者解耦。責任鏈上的對象如果不能處理請求涌乳,就會把請求發(fā)送給下一個責任鏈節(jié)點布疼。

實現(xiàn):

  1. 創(chuàng)建責任鏈節(jié)點的抽象類
  2. 使用抽象類生成若干處理節(jié)點
  3. 節(jié)點依次連接燕锥,保存下一個節(jié)點的地址
  4. 當請求進入時判斷是否是自己處理的類型赚楚,不是傳給下一個節(jié)點。
  5. 請求發(fā)送給責任鏈頭節(jié)點即可

二煌恢、命令模式(Command Pattern)

意圖:將請求(可以是調(diào)用方法的請求)封裝成一個對象骇陈,再創(chuàng)建一個執(zhí)行類,可以向執(zhí)行類中添加請求對象瑰抵,然后再統(tǒng)一執(zhí)行你雌。執(zhí)行前可以任意添加和刪除命令。過程有點類似建造者模式二汛,添加添加然后統(tǒng)一執(zhí)行婿崭。

實現(xiàn):

  1. 創(chuàng)建一個命令的接口,聲明一個execute()執(zhí)行方法
  2. 創(chuàng)建一個請求類肴颊,里面有若干方法氓栈。這個方法原本是直接被調(diào)用的,現(xiàn)在要被外面包裹成命令婿着,然后多個命令放到一個執(zhí)行類中按順序執(zhí)行颤绕。
  3. 實現(xiàn)命令接口幸海,每個命令類代表不同的操作。構(gòu)造方法接收一個請求類奥务,然后在execute()方法中對于具體執(zhí)行操作封裝。
  4. 創(chuàng)建一個命令調(diào)用類袜硫,類中包含一個列表存儲放入的命令類氯葬。其中主要包含
  • 命令列表(list)
  • 添加命令的方法
  • 刪除命令的方法
  • 循環(huán)調(diào)用命令列表中的命令的執(zhí)行方法
  • 還可以有記錄執(zhí)行了那些命令的方法...(可以根據(jù)記錄還原)
  • 還可以加上undo()方法,用于撤銷執(zhí)行的命令婉陷。具體實現(xiàn)要結(jié)合業(yè)務帚称。
  1. 向命令盜用類中添加若干命令,然后調(diào)用執(zhí)行方法統(tǒng)一執(zhí)行所以的命令

三秽澳、解釋器模式(Interpreter Pattern)

意圖:將語言或者表達式解析成具體的操作闯睹,例如sql解析,數(shù)學公式計算(符號處理引擎)等

實現(xiàn):

  1. 創(chuàng)建表達式接口Expression担神,聲明一個解析方法interpret
  2. 創(chuàng)建終結(jié)符類(不能再分割的元素)比如 1 + 2中的12都是終結(jié)符
  3. 創(chuàng)建非終結(jié)符(還能再被分割)1 + 2中的+楼吃。+號左右都可以有元素,在語法樹上就是父節(jié)點妄讯,擁有左右兩個子節(jié)點孩锡。而終結(jié)符就是葉子節(jié)點。
  4. 終結(jié)符和非終結(jié)符都在解析里定義好自己的功能亥贸,
    1 + 1中的終結(jié)符就是構(gòu)造函數(shù)接受字符串并轉(zhuǎn)化成int類型保存躬窜。
    非終結(jié)符+就是構(gòu)造函數(shù)中接收兩個終結(jié)符,并調(diào)用其解析方法結(jié)果相加返回
  5. 將需要解釋的字符串構(gòu)建成語法樹炕置,即非終結(jié)符是父節(jié)點荣挨,終結(jié)符是葉子節(jié)點的樹。然后深度遍歷并解析朴摊。

四默垄、迭代器模式(Iterator Pattern)

意圖: 提供一個方便的遍歷集合的方法,但是不用暴露內(nèi)部結(jié)構(gòu)仍劈。

例子: Java中的集合迭代器

實現(xiàn):

  1. 創(chuàng)建一個迭代器接口厕倍,內(nèi)部聲明hasNext()next()方法
  2. 創(chuàng)建一個集合類,內(nèi)部構(gòu)件好存儲的結(jié)構(gòu)贩疙,并實現(xiàn)迭代器接口
  3. 內(nèi)部使用一個游標存儲當前訪問位置讹弯,int index
  4. hasNext方法返回游標是否到了結(jié)尾
  5. next方法返回當前游標所在的元素,并且游標下移这溅。

五组民、中介者模式(Mediator Pattern)

用于降低對象和類之間的通信復雜性。遵循迪米特原則悲靴,即最少知道原則臭胜。
將原來網(wǎng)狀的通信方式轉(zhuǎn)換成星型的結(jié)構(gòu),所有的類都通過一個中介類進行交流。

實現(xiàn):

  1. 創(chuàng)建一個中介類耸三,其中有發(fā)送信息的方法
  2. 創(chuàng)建溝通的類乱陡,其中的發(fā)送方法使用的就是中介類的方法進行發(fā)送

六、備忘錄模式(Memento Pattern)

允許獲取類的內(nèi)部狀態(tài)仪壮,并且可以設置狀態(tài)以便回復到導出時的狀態(tài)憨颠。
在不破壞封裝的前提下可以完成類的備份還原,可以用作游戲存檔积锅、撤銷操作爽彤、歷史、事務等缚陷。

實現(xiàn):

  1. 創(chuàng)建狀態(tài)的類适篙,其中的成員變量就是從需要還原的類中提取出來的變量。
  2. 創(chuàng)建用于存儲和獲取狀態(tài)的類箫爷,其中用集合保存狀態(tài)類嚷节。
  3. 需要還原的類中實現(xiàn)提取狀態(tài)和通過狀態(tài)類還原的操作,提取也就是把相應的變量賦值給狀態(tài)類蝶缀,還原就是把狀態(tài)類的信息保存到相應變量丹喻。

七、觀察者模式(Observer Pattern)

訂閱/發(fā)布 的模式翁都,發(fā)布消息后會通知所有訂閱了這個主題topic的類碍论。
和中介模式的區(qū)別是這個是很明顯的主體和客體的結(jié)構(gòu),一個主體發(fā)送信息柄慰,多個客體接收鳍悠。
中介模式是所有的類只關(guān)心自己和中介類之間的關(guān)系,溝通全部交給中介處理坐搔。

實現(xiàn)(mqtt的例子):

  1. 設備連接mqtt服務器時維持連接(tcp)
  2. 設備主動訂閱主題藏研,服務器根據(jù)主題保存相應設備信息(在集合里保存觀察者的信息)
  3. 主題有新的發(fā)布后推送給訂閱了此主題的設備

八、狀態(tài)模式(State Pattern)

意圖:
允許類的內(nèi)部在狀態(tài)發(fā)生改變時改變他的行為
代碼中有很多改變對象狀態(tài)的條件語句時概行,可以使用狀態(tài)模式將部分條件語句隱藏在類中
把類的可能出現(xiàn)的狀態(tài)都列舉并封裝了

缺點:
結(jié)構(gòu)較為復雜
對于開閉原則的支持不是很好蠢挡,增加狀態(tài)一定要修改邏輯
類會變龐大

實現(xiàn):
在類中聲明一個狀態(tài)的屬性
進行操作之前判斷一下狀態(tài),然后再執(zhí)行相應的動作

九凳忙、策略模式(Strategy Pattern)

策略模式就是把操作邏輯封裝成不同的類业踏,通過選擇不同的類實例化就是選擇不同的策略。
這種模式可以減少if...else的判斷次數(shù)涧卵,邏輯清晰勤家。
算法自由切換,并且拓展性良好
缺點是會增加代碼量
spring中可以直接把類注冊為組件柳恐,然后再通過名字注入伐脖。很方便就能實現(xiàn)

實現(xiàn):
創(chuàng)建策略的接口热幔,內(nèi)部有具體的操作方法
創(chuàng)建不同的策略實現(xiàn)類,例如+的策略讼庇,就是把傳入值相加绎巨。-的策略就是把傳入值相減。
實例化策略類巫俺,并使用接口操作认烁,執(zhí)行操作方法。
因為是使用接口操作介汹,所以策略類可以更換成其它的策略也可以正常運行

十、模板模式(Template Pattern)

意圖:在抽象類中寫好其它幾個抽象方法直接的調(diào)用關(guān)系舶沛,具體方法讓子類實現(xiàn)嘹承。即搭建好累的框架,細節(jié)讓子類自己實現(xiàn)如庭。

實現(xiàn):

  1. 創(chuàng)建一個游戲的抽象類叹卷,內(nèi)部有初始游戲、開始游戲坪它、結(jié)束游戲三個抽象方法
  2. 增加一個final play方法骤竹,按順序調(diào)用初始、開始往毡、結(jié)束三個抽象方法蒙揣。以指明子類的執(zhí)行順序也是這樣
  3. 創(chuàng)建子類,實現(xiàn)此抽象類开瞭。實現(xiàn)具體的抽象方法
  4. 通過父類執(zhí)行play方法

十一懒震、訪問者模式(Visitor Pattern)

意圖:當一個類的數(shù)據(jù)結(jié)構(gòu)很穩(wěn)固,但是操作容易改變嗤详「鋈牛或者類中有很多和結(jié)構(gòu)無關(guān)的操作,防止這些操作改變類的數(shù)據(jù)葱色。所以采用訪問者模式進行數(shù)據(jù)和操作的分離递宅。
有良好的拓展性,符合單一職責原則苍狰,靈活

關(guān)鍵:數(shù)據(jù)類中實現(xiàn)一個接收訪問的方法办龄,并調(diào)用訪問者的訪問方法,傳入自身
訪問者根據(jù)傳入的數(shù)據(jù)類進行操作

實現(xiàn):

  1. 創(chuàng)建一個被訪問接口舞痰,內(nèi)部有一個被訪問的方法土榴,入?yún)⑹窃L問者接口
  2. 訪問者接口,內(nèi)部有訪問的方法响牛,入?yún)⑹潜辉L問者接口
  3. 實現(xiàn)接口
  4. 訪問者需要訪問時就直接調(diào)用被訪問者的被訪問方法玷禽,并使用入?yún)⒉僮髦怠?/li>

其它設計模式

空對象模式(Null Object Pattern)

意圖:用一個代表空的對象代替null赫段,空對象相對于null可以擁有默認的行為。

實現(xiàn):
創(chuàng)建一個對象接口矢赁,有isNil和相應操作的方法
創(chuàng)建一個空對象糯笙,并實現(xiàn)isNil方法,用于判斷當前方法是否為空撩银。并賦予默認方法给涕,例如輸出當前為空
創(chuàng)建非空對象,實現(xiàn)isNil方法额获,并實現(xiàn)操作方法够庙,如輸出非空
然后就可以使用了,比如從集合中取出非空元素并執(zhí)行抄邀。
-》 遍歷集合耘眨,判斷是否為空,并執(zhí)行默認方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末境肾,一起剝皮案震驚了整個濱河市剔难,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奥喻,老刑警劉巖偶宫,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異环鲤,居然都是意外死亡纯趋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門楔绞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來结闸,“玉大人,你說我怎么就攤上這事酒朵¤氤” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵蔫耽,是天一觀的道長结耀。 經(jīng)常有香客問我,道長匙铡,這世上最難降的妖魔是什么图甜? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮鳖眼,結(jié)果婚禮上黑毅,老公的妹妹穿的比我還像新娘。我一直安慰自己钦讳,他們只是感情好矿瘦,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布枕面。 她就那樣靜靜地躺著,像睡著了一般缚去。 火紅的嫁衣襯著肌膚如雪潮秘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天易结,我揣著相機與錄音枕荞,去河邊找鬼。 笑死搞动,一個胖子當著我的面吹牛躏精,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鹦肿,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼玉控,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狮惜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤碌识,失蹤者是張志新(化名)和其女友劉穎碾篡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筏餐,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡开泽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了魁瞪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片穆律。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖导俘,靈堂內(nèi)的尸體忽然破棺而出峦耘,到底是詐尸還是另有隱情,我是刑警寧澤旅薄,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布辅髓,位于F島的核電站,受9級特大地震影響少梁,放射性物質(zhì)發(fā)生泄漏洛口。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一凯沪、第九天 我趴在偏房一處隱蔽的房頂上張望第焰。 院中可真熱鬧,春花似錦妨马、人聲如沸挺举。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豹悬。三九已至葵陵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞻佛,已是汗流浹背脱篙。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伤柄,地道東北人绊困。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像适刀,于是被迫代替她去往敵國和親秤朗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容