Groovy探索之責任鏈模式

2021-08-23 13:52:36 字數 2377 閱讀 8963

groovy探索之責任鏈模式

責任鏈模式在現實中也有很多對應的例項。

比方說,乙個公司有a,b,c,d四個專案組,各自相鄰。一天,乙個客戶打**進來,說我們某某專案出了點問題,請幫忙解決。**是由a專案組的人接的,a專案組的人一聽,說這不是我們負責的專案,我們把它交給b專案組吧。b專案組的人一聽,也說,這也不是我們專案組負責的,我們把它交給c專案組吧。c專案組的人一聽,說,這是我們負責的專案,我們來處理吧。

上面的例項很形象的表現了乙個責任鏈模式的處理過程:乙個專案或過程裡有多個相似的責任,分別由各自的處理模組來處理;我們的解決方法就是將這些所有的處理模組組成乙個鏈;然後,當乙個責任發生時,將這個責任沿著鏈流轉,如果當前處理模組不處理該責任,則把該責任流轉到鏈的下乙個處理模組,依此類推,直到該責任找到處理模組為止。

我們都愛讀《西遊記》這部**,其中有乙個情節是"孫悟空大戰二郎神",相信大家都很熟悉。

**裡是這麼描述的:

"悟空見自己的老窩被破壞了,心裡一慌,變成麻雀想跑,二郎神搖身變成了捉麻雀的鷹,

抖抖翅膀就去啄麻雀;悟空急忙又變成乙隻大鷀鳥,衝向天空,二郎神急忙變成了乙隻大海鶴,

鑽進雲裡去撲;悟空一見嗖地一聲飛到水裡,變成一條魚。

二郎神從照妖鏡裡看見了悟空,就變成魚鷹,在水面上等著,悟空見了,

急忙變條水蛇,竄到岸邊,接著又變成花鴇,立在蘆葦上。二郎神見他變的太低賤,也不去理他,

變回原來的樣子,取出彈弓,朝著花鴇就打,把悟空打得站立不穩。"

這是其中的一段二人的變幻大戰,描寫的很精彩。其中,孫悟空分別變幻成"麻雀"、"大鷀鳥"、"魚",企圖躲過二郎神的眼睛,達到逃跑的目的。而二郎神也分別變幻成"鷹"、"大海鶴"、"魚鷹"來和孫悟空爭鋒相對。

從上面的分析,如果把二郎神對付孫悟空當做乙個過程,那麼孫悟空的三個變幻就是三種不同的職責,而二郎神也通過三個不同的處理模組來對付它們。

那麼,我們就可以通過責任鏈模式來模擬二郎神和孫悟空的這段變幻大戰了。

首先,二郎神的第乙個處理模組是"鷹":

classhawk

deffight(wukong)

else}

在這個"hawk"類中,只有乙個屬性是"next",指向它的下乙個處理模組。當這個類初始化的時候確定它的下乙個處理模組是什麼。

然後,我們看它的"fight"方法,有乙個傳入引數"wukong",代表的是孫悟空的當前變幻,如果它的當前變幻是"麻雀"的話,就被"hawk"處理;如果不是的話,"hawk"類就會傳給下乙個處理模組來處理。

當然,二郎神的第二個處理模組"大海鶴"的功能也跟第一處理模組相似:

classcrane

deffight(wukong)

else}

可以看到,功能跟"hawk"類一樣,在這裡我們就不多說了。同樣的還有乙個:

classosprey

deffight(wukong)

else}

這個類也沒有什麼可說的,但是,在責任鏈模式中,還有乙個類是必須的,這就是預設的處理模組,它的作用是處理當這個責任鏈流轉結束的時候,仍然沒有找到適合的處理模組的話,就交給預設的處理模組來處理。它的作用實際上是使得這個責任鏈能夠正常流轉處理結束。

在這裡,我們的預設處理模組是判給孫悟空贏,如下:

classother

現在,整個責任鏈宣告完成,我們需要寫乙個客戶端**來測試它。

defwukong = 'fish'

deferlangshen =newhawk(newosprey(newcrane(newother())))

erlangshen.fight(wukong)

在我們的客戶端**中,孫悟空的變幻是一條"魚":

defwukong = 'fish'

而二郎神則有乙個變幻的責任鏈:

deferlangshen =newhawk(newosprey(newcrane(newother())))

下面二郎神就要大戰孫悟空了:

erlangshen.fight(wukong)

它的執行結果為:

osprey eat fish

設計模式之 責任鏈模式

在一些情況下,對乙個訊息 含事件 的響應和處理需要很多物件來參與,這些物件對訊息的處理有前後順序,形成乙個處理鏈條,但物件是否真正處理訊息有賴於在它之前的物件的處理策略,前乙個物件處理後,後乙個物件則不需參與處理,這就是責任鏈模式。現實中有很多類似的場景,比如上訪,上訪一般是從最基層的信訪部門接受信...

設計模式之(責任鏈模式)

chain of responsibleity 責任鏈模式 在責任鏈模式 中,很多物件由每乙個物件對其下家的引用而接。起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某乙個物件決定處理此請求。客戶並不知道鏈上的哪乙個物件最終處理這個請求,系統可以在不影響客戶端的情況下動態的重新組織鏈和分配責任。處理者...

設計模式之責任鏈模式

假設現在乙個公司的請假流程如下 一天及以下由小組組長審批,一天以上三天以下由經理審批,三天以上七天以下由老闆審批,七天以上直接勸退。如果每次請假時都很長的if else 來判斷該去找誰請假,很不容易擴充套件,我們使用責任鏈模式來實現。首先,是乙個抽象的父類 public abstract class...