簡明 責任鏈模式(5 1)

2022-09-24 02:48:09 字數 1399 閱讀 1731

學生請假是乙個經典的引入責任鏈模式(chain of responsibility pattern)的現實場景。學生通常向輔導員請假,按照請假的天數不同如幾節課、幾天、乙個月、一年等,輔導員可能自己或要請示院黨委副書記、書記、學校校長批准。

責任鏈模式可以稱為「推卸」式的**,多個物件能夠處理客戶發出的請求,即它們都具有相應的方法如handle()。

責任鏈模式中,多個處理者物件可以構成一定的資料結構,簡單地如單向鍊錶。不論構成什麼結構,對於處理者的抽象正如資料結構中常用的結點。結點是自引用的,它含有乙個或多個本型別的成員變數。

例程 6 1 簡單的責任鏈

package structure.chain;

public abstract class ihandler

public void handle(int day)else

}}package structure.chain;

public class h2 extends ihandlerelse

}}假定輔導員、院黨委副書記、書記、學校校長分別為h1、h2、h3和h4。現在先實現h1和h2。測試類的**:

例程 6-2 測試

package structure.chain;

import tool.god;

public class student

}bluej中測試輸入1、2、10的輸出為:

okstructure.chain.h1

okstructure.chain.h2

no handler

假設學生直接找h2處理,即最後一句為h2.handle(x),輸入1為no handler。這是因為程式中處理者構成的是單向鍊錶,可用雙向鍊錶解決此問題。也可以h2.setnext(h1)。

責任鏈模式將乙個請求的處理者設計為乙個鏈,鏈上的每個類都可以處理這個請求,或者將處理責任踢皮球給下家。

責任鏈的「鏈」表示處理流程的走向,h1、h2、h3和h4本身的具體資料結構可以是單向鏈、單向環、雙向鏈或樹。乙個典型的應用,就是處理者形成組合模式的樹形結構,而將請求/責任沿著樹形結構的某種路徑,向上或向下傳遞。

本例有若干細節需要注意:

l 請求者可以向責任鏈上任一處理者提出請求。在相應的結構支援下,可以按照處理許可權上交的方式、按照分段(許可權平行)的方式或向下授權的方式處理。例程中演示了分段的方式,你可以改成上交的方式,規定學生總是找輔導員請假。

l 請求可以被責任鏈處理或不處理。如果要求「請求在責任鏈中必須被處理」,可以在抽象類中給出缺省處理方案。

l 本例中子類沒有指定自己的後續結點。抽象類的next設計private而非其他訪問許可權,子類除了自己的處理**,其他就交給super.handle(day)。

上述注意事項主要針對某些朋友的一些含混認識。通過修改上面的例子,你可以實驗一下責任鏈的若干變體。

凝練 責任鏈模式(5 1)

學生離開是一種典型表現責任鏈模式 chain of responsibility pattern 逼真的場景。學生通常留給輔導員,按照休假的天數如幾個不同的類 幾天 乙個月 年份等。輔導員可能想諮詢自己或醫院黨委副書記 秘 責任鏈模式可以稱為 推卸 式的 多個物件可以處理客戶發出的請求,即它們都具有...

責任鏈模式

責任鏈模式 chain of responsibility 的目標是使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞請求,直到有乙個物件處理它為止。舉個例子。你到銀行去辦理業務,只是簡單的存個錢,也許atm就解決你的問題。如果你是為了交費...

責任鏈模式

有3個request與3個handler,每個request由相應的handler來處理,當乙個handler與request不匹配時則傳遞給下乙個handler來處理 inte ce request class request1 implements request class request2 ...